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

时间:2014-06-09 17:51:08

标签: java javafx

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

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

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

----- ----- UPDATE 正如@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时,它会打开新窗口,当我关闭它时,窗口会再次打开。 我能解决吗?

1 个答案:

答案 0 :(得分:15)

请改用事件过滤器。某些控件会消耗按键事件,因此使用事件过滤器可以在控件使用之前处理它们。

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