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

标签 java javafx keyevent

我想检测一个 KeyEvent无论我的 JavaFX 应用程序中的焦点是什么元素 - 特别是,我想检测 SPACE key 。我试图给 Scene 添加一个监听器对应于我的窗口:

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

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

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

最佳答案

您可以通过向根节点添加事件过滤器来检测 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 添加到上面的示例中,则可以看到此行为

关于java - 如何在我的 JavaFX 应用程序中的任何位置检测 SPACE KeyEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37648222/

相关文章:

combobox - JavaFX - 如何使 ComboBox hgrow?

java - 为什么 javac 编译器找不到 javafx.collections 但我正在使用它?

java - 对话框打开时检测后退按钮事件

javascript - JavaScript 中的关键事件

java - Android:KeyEvent.KEYCODE_X 显示为 '8'

java - 无法从类路径获取文件(使用 NIO2)

java - 微调器onItemSelectedListener无法正常工作

Java PrintWriter 未写入 javafx 中的文件

java - PHP 的 print_r 函数在 Java 中的等价物是什么?

java - 将实体字段更改为不同类型的字段