如何在JavaFX应用程序中的任何位置检测SPACE KeyEvent?

时间:2016-06-06 00:49:05

标签: java javafx keyevent

我想检测一个KeyEvent,无论我的JavaFX应用程序中哪个元素有焦点 - 特别是,我想检测SPACE密钥。我试图向与我的窗口对应的Scene添加一个监听器:

scene.setOnKeyPressed(ev -> {
    if (ev.getCode() == KeyCode.SPACE) {
        System.out.println("GOOD");
    }
});

但如果我有一个具有焦点的特定节点(如ListViewButton),则无法检测到它。

无论用户在我的应用中做什么,我怎样才能检测到SPACE键被按下的时间?我不打算中断接收KeyEvent的任何节点 - 我只是想知道它是否发生。一个(丑陋的)解决方案是将监听器添加到我的所有节点,但如果可能的话我宁愿不这样做。

2 个答案:

答案 0 :(得分:2)

您可以通过向根节点添加事件过滤器来检测KeyEvent

以下是使用您提到的一些控件的快速示例:

@Override
    public void start(Stage primaryStage) throws Exception{
        TextField textfield = new TextField();
        ListView listView = new ListView();
        listView.getItems().add("One");
        listView.getItems().add("Two");
        listView.getItems().add("Three");
        Button button = new Button("Button");

        VBox root = new VBox(5, textfield, listView, button);
        root.addEventFilter(KeyEvent.KEY_PRESSED, event->{
            if (event.getCode() == KeyCode.SPACE) {
                System.out.println("GOOD");
            }
        });
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

注意:在生成弹出窗口/叠加层的控件上,可能在显示空间时未检测到空格,但在隐藏但仍处于焦点位置时将检测到该空格。如果将ComboBox或ColorPicker添加到上面的示例

,则可以看到此行为

答案 1 :(得分:-1)

这是您的代码

        scene.setOnKeyReleased(event ->{
        if(event.getCode()== KeyCode.SPACE)
        {
            System.out.println("goog luck");
        }

        });