【问题标题】:javafx keyboard event shortcut keyjavafx 键盘事件快捷键
【发布时间】:2014-08-20 06:05:12
【问题描述】:

我想在 javafx 中添加键盘快捷键。

我有场景并想实现键盘快捷键

我的代码如下

getApplication().getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {

        public void handle(KeyEvent ke) {
            if (ke.getCode() == KeyCode.ESCAPE) {
                System.out.println("Key Pressed: " + ke.getCode());
            }
        }
    });

【问题讨论】:

  • 问题出在哪里?
  • 我的场景是 getApplication().getScene(),我没有得到关键事件
  • getApplication() 在做什么?它是否返回您的 Application 实例?你能发一个SSCCE描述你的问题吗?
  • 您是在寻找全局快捷键(在应用程序的所有位置都有效的键)还是在更窄范围内操作的键?
  • 是的,我正在寻找那种快捷键

标签: javafx keycode


【解决方案1】:

事件从场景传播到焦点节点(事件捕获),然后返回场景(事件冒泡)。在事件捕获期间触发事件过滤器,而在事件冒泡期间触发 onKeyPressed 和事件处理程序。某些控件(例如 TextField)会消耗事件,因此它永远不会回到场景中,即事件冒泡被取消并且场景的 onKeyPressed 不起作用。

要获取 所有 按键事件,请使用 addEventFilter 方法:

scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    public void handle(KeyEvent ke) {
        if (ke.getCode() == KeyCode.ESCAPE) {
            System.out.println("Key Pressed: " + ke.getCode());
            ke.consume(); // <-- stops passing the event to next node
        }
    }
});

如果您想捕获 组合键,请使用 KeyCodeCombination 类:

scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    final KeyCombination keyComb = new KeyCodeCombination(KeyCode.ESCAPE,
                                                          KeyCombination.CONTROL_DOWN);
    public void handle(KeyEvent ke) {
        if (keyComb.match(ke)) {
            System.out.println("Key Pressed: " + keyComb);
            ke.consume(); // <-- stops passing the event to next node
        }
    }
});

还可以通过设置加速键向菜单添加快捷方式(参见 [2])。

参考文献

【讨论】:

    【解决方案2】:

    我不确定你在用getApplication 做什么,只是为了表明Scene 上的KeyEventHandler 有效,这里有一个演示给你。

    import javafx.application.Application;
    import javafx.event.EventHandler;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class MyApp extends Application {
        public void start(Stage stage) {
    
            VBox root = new VBox();
            root.setAlignment(Pos.CENTER);
            Label heading = new Label("Press Key");
            Label keyPressed = new Label();
            root.getChildren().addAll(heading, keyPressed);
            Scene scene = new Scene(root, 400, 300);
    
            scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
                public void handle(KeyEvent ke) {
                    keyPressed.setText("Key Pressed: " + ke.getCode());
                }
            });
    
            stage.setTitle("My JavaFX Application");
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

    • 您可以通过给它一个fx:id 或获取您选择的场景的一个组件并执行myComponent.getScene() 来获取控制器的场景。或者您可以在 fxml 文件中(或通过 SceneBuilder)设置场景的 onKeyPressed 属性/方法/动作。
    【解决方案3】:

    我刚开始学习 javaFX,所以希望能帮助像我这样的人:)

    这里是如何退出应用程序的组合键示例。您可以执行任何您想要的操作。

    1st,初始化一个控制器(可以是一个按钮或菜单项)

    MenuItem quit = new MenuItem("Quit");
    

    2、设置事件处理程序

    quit.setOnAction(new EventHandler() {
       @Override public void handle(ActionEvent e) {
         //  quit/close app
         primaryStage.close();
       }
    });
    

    然后 setAccelerator 执行一个动作

    quit.setAccelerator(new KeyCodeCombination(KeyCode.E, KeyCombination.CONTROL_DOWN));
    

    这里有详细教程

    https://blog.idrsolutions.com/2014/04/tutorial-how-to-setup-key-combinations-in-javafx/

    希望有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多