Обработка нажатия клавиши ВВОД в JavaFX 8 DataPicker

1

Я использую ENTER как TAB в своем приложении JavaFX, в качестве реквизита для пользователей. Я использую следующий код, чтобы определить, все управления, которая существует в панели и добавить 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 в этих компонентах?

Теги:
datepicker
javafx-8
event-handling
jfxtras

1 ответ

1
Лучший ответ

Вместо использования setOnKeyPressed, теперь я использую 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);
        }
    }
}

Поскольку я подозревал, что реализация компонентов потребляла событие до того, как он попадает в обработчик, addEventFilter был лучшим выбором:

Фильтр вызывается, когда узел получает событие указанного типа во время фазы захвата доставки события.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню