Наше приложение использует пользовательский интерфейс JavaFX с одним этапом, который содержит панель меню вверху и ряд других элементов управления под ним.
Мы хотим использовать KeyCode.SPACE (то есть пробел) в качестве ускорителя для одного из элементов меню в нашей панели меню. Да, я знаю, что это не идеальная клавиша для ускорителя меню. Это не мое решение. :)
Так или иначе, поначалу ускоритель SPACE работал нормально:
menuItem.setAccelerator( KeyCombination.valueOf( "SPACE" ) );
Но когда мы начали добавлять другие элементы управления, такие как TableView, в нашу рабочую область, этот ускоритель перестал работать. Оказывается, эти другие элементы управления используют SPACE для своих целей и потребляют KeyEvent, прежде чем он вернется в MenuBar.
Итак, мы решили, что нам не нужен SPACE для работы с этими другими элементами управления, и поэтому я «решил» проблему, используя фильтр событий. Он крадет SPACE KeyEvent для моего MenuItem, прежде чем он когда-либо доберется до этих других элементов управления:
stage.addEventFilter( KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
public void handle( KeyEvent e ) {
if ( e.getCode() == KeyCode.SPACE &&
!(e.getTarget() instanceof TextInputControl) &&
!menuItem.isDisable() ) {
e.consume();
menuItem.fire();
}
}
});
Кажется, это работает, но я надеюсь, что может быть более чистое и менее хрупкое решение. В частности, мне бы очень хотелось найти способ сообщить другим элементам управления (например, TableView) просто прекратить использование SPACE KeyEvent.
Это возможно?