Я хочу прослушать некоторый KeyEvent в своей сцене, скажем KeyCode.ESCAPE
(закройте сцену при нажатии).Порядок распространения JavaFX KeyEvent
scene.addEventHandler(KeyEvent.ANY, event -> {
if (event.isConsumed())
return;
switch (event.getCode()) {
case ESCAPE:
stage.hide();
event.consume();
break;
default:
break;
}
});
Теперь узлы внутри сцены могли слушать ESCAPE
тоже.
// ....
someOtherNode.addEventHandler(KeyEvent.ANY, e -> {
if (e.getCode() == KeyCode.ESCAPE) {
// do stuff
e.consume();
}
});
// ....
Как я могу убедиться, что KeyEvent
будет потребляться от узла, а не на сцене?
Основываясь на диаграмме из Oracle, Обходной бы добавление фиктивной Node
в конце иерархии узла, который слушает KeyCode
с
но есть лучшее решение, как инвертирующий маршрут распространения?
EDIT:
Прецедент:
Всплывающее подобный узел, который блокирует другие узлы должны были бы прислушивается к клавише ESC или focusProperty()
так, что она может закрыться.
Я могу быть плотным, но разве это не те фильтры и обработчики? Фильтры останавливают событие (если оно потребляется) во время фазы захвата. Послесловия обработчики событий могут срабатывать в фазе барботажа. Один из них является обратным для другого. – brian