如果存在焦点组件,则不执行场景的JavaFX Key Pressed事件

我有一个代码,当按下某个键时执行某些function:

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(); } } }); 

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

请改用事件filter。 某些控件使用按键事件,因此使用事件filter可以在控件使用之前处理它们。

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