【问题标题】:JavaFX Key Pressed event for scene not executed if there is a focused component如果有焦点组件,则不执行场景的 JavaFX Key Pressed 事件
【发布时间】:2017-07-06 22:24:17
【问题描述】:

我有一个代码可以在按下某个键时执行某些功能:

scene.setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.F1) {
        doSomething();
    }
});

它可以工作,但前提是没有焦点组件,如 Button 或 TextField。 我注意到如果我按下 CTRL+F1、ALT+F1 或 SHIFT+F1,它会起作用,但如果没有焦点组件,只有 F1 才起作用。 有没有办法避免这种情况?

-----更新----- 正如@James_D 所说,我可以使用 eventFilter 而不是 eventHandler:

scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
    if (event.getCode().equals(KeyCode.ESCAPE)) {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(TelaPrincipalController.class.getResource("/br/com/atualy/checkout/layout/telaoperacoescaixa.fxml"));
            Parent parent = fxmlLoader.load();
            Scene scene = new Scene(parent, 600,400);
            Stage stage = new Stage();
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.initOwner(this.stage);
            stage.showAndWait();
            System.out.println("----> THIS IS BEING PRINTED TWICE ! <----");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

此代码中的第 12 行每按一次 ESC 键就会打印两次。这意味着当我按下 esc 时,它会打开新窗口,当我关闭它时,窗口会再打开一次。 我能解决吗?

【问题讨论】:

  • 不太确定为什么会这样,但您可以通过在 System.out.println(...) 之后使用该事件来解决它

标签: java javafx


【解决方案1】:

改为使用事件过滤器。一些控件消耗按键事件,因此使用事件过滤器可以让您在控件消耗它们之前处理它们。

scene.addEventFilter(KeyEvent.KEY_PRESSED,
                event -> System.out.println("Pressed: " + event.getCode()));

【讨论】:

  • 看起来事件过滤器执行了两次,如果在代码中我打开一个新的模态窗口。请在问题中查看我的更新
  • 尝试使用KeyEvent.KEY_RELEASED 而不是KeyEvent.KEY_PRESSED
  • 为什么使用这一行给我一个,类场景中的方法 addEventFilter 不能应用于给定类型;必需:EventType,EventHandler super T> found: int,(event)->S[...]de()) 编译时错误
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2012-04-01
  • 2015-07-04
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多