如何从控制器在JavaFX中设置键盘快捷键

如何从控制器在JavaFX中设置键盘快捷键,java,javafx,controller,Java,Javafx,Controller,我有一个程序,它有多个选项卡,每个选项卡都有自己的控制器。我想在每个选项卡上都有不同的键盘快捷键 但是,我找不到这样做的方法,因为我需要将EventFilter添加到场景中,但当Controller.initialize()运行时,场景仍然为null。如何解决这个问题 目前我正在这样做: final KeyCombination openDir = new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN, KeyCombinat

我有一个程序,它有多个选项卡,每个选项卡都有自己的控制器。我想在每个选项卡上都有不同的键盘快捷键

但是,我找不到这样做的方法,因为我需要将EventFilter添加到场景中,但当Controller.initialize()运行时,场景仍然为null。如何解决这个问题

目前我正在这样做:

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()
返回空值,这可能是因为控制器初始化时场景尚未设置。

在尝试之后,我找到了以下解决方案。它观察场景属性,当场景更改时,它会删除旧的侦听器并添加新的侦听器

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);
    }
});
final KeyCombination openDir=新的KeyCodeCombination(KeyCode.O,KeyCombination.CONTROL\u DOWN,KeyCombination.SHIFT\u DOWN);
EventHandler EventHandler=事件->{
if(openDir.match(事件)){
debug(“事件匹配”);
}
};
list.sceneProperty().addListener((可观察、旧值、新值)->{
if(oldValue!=null){
removeEventFilter(按下键,eventHandler);
}
if(newValue!=null){
addEventFilter(按下键,eventHandler);
}
});

也许您应该为控制器添加一个方法
addListener
,该方法添加事件侦听器,并在列表成为场景的一部分时调用该方法。您可以更具体地说明如何执行该操作吗?我试图添加监听器,但在Android中没有类似的onShow()事件。很高兴我能够帮助您!