У меня есть требование перемещаться по таблице, когда пользователь нажимает клавишу ENTER. Для этого я создал фильтр событий, похожий на:KeyEvent on Dialog не используется при закрытии в JavaFX
private EventHandler<KeyEvent> keyReleasedFilter = event -> {
if ((event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB)) {
previousPosition = table.getFocusModel().getFocusedCell();
//do my navigation
}
}
я столкнулся с проблемой, когда JavaFX Modal Dialogs, используемой во время навигации таблицы, чтобы указать ошибку, вызывают проблемы с этим фильтром. Если пользователь закрыл диалог с помощью клавиши ENTER, это событие попадает в ловушку моего фильтра событий на родительском этапе. Я не знаю, как это предотвратить. Это вызывает непоследовательную навигацию.
Вот простое приложение, которое демонстрирует поведение:
public void start(Stage primaryStage) {
final Alert d = new Alert(Alert.AlertType.ERROR);
d.initModality(Modality.WINDOW_MODAL);
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.addEventFilter(KeyEvent.KEY_RELEASED, event -> {
if ((event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB)) {
d.showAndWait();
}
});
Scene scene = new Scene(new StackPane(btn), 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
Я заметил, что диалог будет закрыт с KEY_PRESSED события, а не захватит KEY_RELEASED события.
Я попытался добавить фильтр событий в диалог (Button/DialogPane/Scene и даже Stage) - никто не перехватывает событие KEY_RELEASED.
Спасибо.
Я попытался использовать event.consume() на dialog.setOnHidden(), но это тоже не работает. –