【问题标题】:Handling ENTER key pressing in JavaFX's 8 DataPicker在 JavaFX 8 DatePicker 中处理 ENTER 键按下
【发布时间】:2014-03-18 13:15:48
【问题描述】:

我在我的 JavaFX 应用程序中将 ENTER 实现为 TAB,这是用户的必需品。我正在使用以下代码来识别存在于Pane 中的所有Control 并添加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 按键?

【问题讨论】:

    标签: java event-handling datepicker javafx-8 jfxtras


    【解决方案1】:

    我现在使用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 是最好的选择:

    当节点在事件传递的捕获阶段接收到指定类型的事件时调用过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 2011-06-11
      • 2015-08-08
      • 1970-01-01
      • 2012-12-02
      • 2018-02-22
      • 2011-09-26
      • 2011-10-16
      相关资源
      最近更新 更多