java - 在 JavaFX 8 DatePicker 中处理 ENTER 键按下

标签 java event-handling datepicker javafx-8 jfxtras

作为用户的必要条件,我在我的 JavaFX 应用程序中将 ENTER 实现为 TAB。我正在使用以下代码来识别所有 Control存在于 Pane 中并添加 OnKeyPressed处理程序:

protected EventHandler<KeyEvent> processadorEnterEmCampo = new EventHandler<KeyEvent>() {
    public void handle(final KeyEvent evento) {
        if (evento.getCode() == KeyCode.ENTER) {
            evento.consume();
            ((Node)evento.getSource()).fireEvent(new KeyEvent(evento.getSource(), evento.getTarget(), evento.getEventType(), null, "TAB", KeyCode.TAB, false, false, false, false));
        }
    }
};  

private void adicionarProcessadorEventoEnterPressionado(Node elemento) {
    if(elemento instanceof Pane){
        Pane painel= (Pane) elemento;
        for(Node filho :painel.getChildren()){
            if(filho instanceof TextField || filho instanceof ComboBox || filho instanceof CheckBox
                    || filho instanceof DatePicker || filho instanceof BigDecimalField)
                filho.setOnKeyPressed(processadorEnterEmCampo);
            else if(filho instanceof Button)
                filho.setOnKeyPressed(processadorEnterEmBotao);
            else
                adicionarProcessadorEventoEnterPressionado(filho);
        }
    }
}

除了 BigDecimalField 和 DatePicker 之外,上面的代码运行起来很顺利。 .当我按下 ENTER 键时,它根本不运行处理程序的代码,只有当我按下 SHIFT 键时,处理程序的代码才会执行​​。我相信这种情况正在发生,因为这些组件已经具有一些带有 ENTER 键的功能。我可以做些什么来处理这些组件中的 ENTER 键按下?

最佳答案

我现在使用 addEventFilter 而不是使用 setOnKeyPressed :

private void adicionarProcessadorEventoEnterPressionado(Node elemento) {
    if(elemento instanceof Pane){
        Pane painel= (Pane) elemento;
        for(Node filho :painel.getChildren()){
            if(filho instanceof TextField || filho instanceof ComboBox || filho instanceof CheckBox
                    || filho instanceof DatePicker || filho instanceof BigDecimalField)
                filho.addEventFilter(KeyEvent.KEY_PRESSED,processadorEnterEmCampo);
            else if(filho instanceof Button)
                filho.setOnKeyPressed(processadorEnterEmBotao);
            else
                adicionarProcessadorEventoEnterPressionado(filho);
        }
    }
}

因为我怀疑组件的实现在事件到达处理程序之前消耗了事件,所以 addEventFilter 是最好的选择:

The filter is called when the node receives an Event of the specified type during the capturing phase of event delivery.

关于java - 在 JavaFX 8 DatePicker 中处理 ENTER 键按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22480551/

相关文章:

java - 使用 HttpClient/MultipartEntity 流式传输上传

java - Spring Boot Hibernate高效事务管理

java - 未找到 ServletContainer 类异常

java - 如何传递整数数组testng.xml

c++ - 在 MFC 应用程序中以编程方式调用事件处理程序

android - Spinner onClick 显示 DatePicker 对话框

c# - 在静态方法(扩展方法)中取消订阅匿名事件处理程序

外部文件中的 JavaScript 在 script 标签的 onload 事件之前执行

html - 输入文本框旁边不显示日期选择器图标

javascript - 无法将昨天的日期设置为kendo ui datepicker