【问题标题】:Event filter on DatePicker fires twice for one actionDatePicker 上的事件过滤器为一个操作触发两次
【发布时间】:2017-02-27 10:26:34
【问题描述】:

我有这段代码可以使用键盘在日期选择器中修改日期:

DatePicker startDatePicker = new DatePicker();
startDatePicker.addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {

        if (event.getCode().equals(KeyCode.UP)){

                startDatePicker.setValue(startDatePicker.valueProperty().get().plusDays(1));
                event.consume();


        }else if (event.getCode().equals(KeyCode.DOWN)){

                startDatePicker.setValue(startDatePicker.valueProperty().get().minusDays(1));
                event.consume();


        }

    });

但是,无论我做什么,每次按键都会触发两次事件。我尝试使用 KEY_PRESSED 和 KEY_RELEASED,消费或不消费事件,但无论我做什么,它总是会触发两次(使用输出到控制台进行测试,每次按键都会产生两行)。现在我正在使用布尔变量解决它,因此该事件仅每隔一次有效,但必须有比这更好的解决方案。

【问题讨论】:

    标签: java events javafx eventfilter


    【解决方案1】:

    我不完全确定为什么会这样;看起来日期选择器的弹出窗口接收到事件,并将其重定向到日期选择器,然后日期选择器本身独立接收事件。这可能是一个错误。将侦听器添加到文本字段是否足够解决问题:

    startDatePicker.getEditor().addEventFilter(KeyEvent.KEY_PRESSED, ...);
    

    【讨论】:

    • 在 2021 年仍然是一个错误。
    • @dmolony 肯定是一个错误(自我注意:检查我们是否有问题) - 从技术上讲,它是由 ComboBoxPopupControl 安装的关键事件过滤器(== 选择器和组合的常见皮肤实现)手动触发所有关键事件都进入编辑器。从我的笔记中:evil: child.fireEvent(..)(f.i.如果孩子不是focusOwner)-“仅”导致通知过滤器/处理程序从节点到场景两次(而不是非常邪恶:getParent().fireEvent(..) 完全破坏了事件调度 :) 不容易修复,我猜我们需要自定义事件调度(与 fire 相比)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2019-12-19
    • 1970-01-01
    • 2015-03-21
    • 2015-03-16
    • 2014-04-07
    相关资源
    最近更新 更多