Добавление входного фильтра в TextField блокирует обработку по умолчанию клавиши ESC - PullRequest
1 голос
/ 14 июня 2019

Контекст: JDK 8 & JavaFX

У меня есть элемент управления TextField, который используется в диалоге. Это первый элемент управления для редактирования, поэтому он получает фокус при открытии диалогового окна. В диалоговом окне есть кнопка, настроенная как кнопка отмены (Button.setCancelButton (true))

В обычном TextField, если я нажимаю ESC сразу после открытия диалогового окна, диалоговое окно закрывается (как и ожидалось).

Однако, как только я добавляю TextFormatter с фильтром ввода в TextField, нажатие клавиши ESC, по-видимому, используется элементом управления вводом, и ESC больше не закрывает диалоговое окно.

TextFormatter имеет только фильтр ввода (для ограничения элемента управления вводом только цифрами), но фильтр ввода не вызывается при нажатии клавиши ESC - потому что содержимое поля не изменилось.

Это довольно незначительная проблема, но раздражает отсутствие последовательного поведения и невозможность просто нажать ESC, чтобы закрыть диалоговое окно. Любые идеи о том, как обеспечить, чтобы нажатие клавиши ESC распространялось / не использовалось, чтобы оно обрабатывалось диалогом?

Редактировать:

Мой вопрос выглядит дубликатом этого вопроса: Выход из числового текстового поля в диалоговом окне JavaFX . Что, конечно, мне не удалось найти, несмотря на то, что я просматривал Google перед публикацией ... TLDR; класс TextFormatter не может переслать событие нажатия клавиши ESC.

1 Ответ

3 голосов
/ 14 июня 2019

Я думаю, что самый простой подход состоит в том, чтобы не пытаться «исправить» TextField и TextFormatter, а просто добавить ключевой слушатель:

textField.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.ESCAPE) {
        dialog.setResult(ButtonType.CANCEL);
    }
});

Если диалог не является предупреждением (или, точнее,не Dialog<ButtonType>), вы можете найти кнопку и активировать ее самостоятельно:

textField.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.ESCAPE) {
        Button cancelButton = (Button)
            dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
        cancelButton.fire();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...