我的程序有多个标签,每个标签都有自己的控制器。我想在每个标签上都有不同的键盘快捷键。
但是我找不到这样做的方法,因为我需要将EventFilter添加到Scene,但是当Controller.initialize()运行时,场景仍为空。怎么解决这个问题?
目前我正在这样做:
final KeyCombination openDir = new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN);
list.getScene().addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (openDir.match(event)) {
logger.debug("Event match.");
}
});
问题是,list.getScene()
返回null,这可能是因为当控制器初始化时场景尚未设置。
答案 0 :(得分:1)
在玩完之后我找到了以下解决方案。它观察场景属性,当场景发生变化时,它会删除旧的侦听器并添加一个新的侦听器。
final KeyCombination openDir = new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN);
EventHandler<KeyEvent> eventHandler = event -> {
if (openDir.match(event)) {
logger.debug("Event match.");
}
};
list.sceneProperty().addListener((observable, oldValue, newValue) -> {
if (oldValue != null) {
oldValue.removeEventFilter(KEY_PRESSED, eventHandler);
}
if (newValue != null) {
newValue.addEventFilter(KEY_PRESSED, eventHandler);
}
});