简体   繁体   中英

Handling ENTER key pressing in JavaFX's 8 DataPicker

I'm implementing ENTER as TAB in my JavaFX application, as a requisite of users. I'm using the following code to identify all Control that exists in a Pane and add a OnKeyPressed handler:

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);
        }
    }
}

The above code runs like a charm, except for BigDecimalField and DatePicker . It simply don't runs handler's code when I press ENTER key, only when I press SHIFT key the handler's code is executed. I believe this is happening because these components already have some functionality with ENTER key. What I could do to handle ENTER key press in these components?

Instead of use setOnKeyPressed, now I'm using addEventFilter :

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);
        }
    }
}

As I was suspecting that the implementation of the components was consuming the event before it gets to the handler, addEventFilter was the best bet:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM