【问题标题】:How to set set keyboard shortcuts in JavaFX from controller如何从控制器在 JavaFX 中设置键盘快捷键
【发布时间】:2016-11-18 16:44:02
【问题描述】:

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

但是我找不到这样做的方法,因为我需要将 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 这可能是因为控制器初始化时尚未设置场景。

【问题讨论】:

  • 也许你应该有一个方法 addListener 到控制器,添加事件侦听器并在列表是场景的一部分时立即调用该方法
  • 您能具体说明一下如何做到这一点吗?我尝试添加侦听器,但没有像 Android 中那样的 onShow() 事件。

标签: java javafx controller


【解决方案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);
    }
});

【讨论】:

  • 很高兴能为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多