2016-11-18 82 views
2

我有一个程序,它有多个选项卡,每个选项卡都有它自己的控制器。我想在每个选项卡上使用不同的键盘快捷键。如何在控制器中设置JavaFX中的设置键盘快捷方式

但是我无法找到一个方法来做到这一点,因为我需要EventFilter添加到场景,但是当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

也许你应该有一个方法,'addListener'控制器,增加了事件侦听器,一旦该列表是 –

+0

你可以对如何做到这一点更具体的一个场景的一部分调用该方法?我试图添加监听器,但没有像Android一样的onShow()事件。 – lsrom

回答

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); 
    } 
}); 
+0

它的工作原理,谢谢。 – lsrom

+0

很高兴我能够帮助你! –

相关问题