在JavaFX的8 DatePicker中按下ENTER键

时间:2014-03-18 13:15:49

标签: 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按键?

1 个答案:

答案 0 :(得分: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是最好的选择:

  

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