我想在javafx中添加键盘快捷键。
我有场景并想要实现键盘快捷键
我的代码如下
getApplication().getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
if (ke.getCode() == KeyCode.ESCAPE) {
System.out.println("Key Pressed: " + ke.getCode());
}
}
});
事件从场景传播到聚焦节点(事件捕获),然后返回场景(事件冒泡)。事件过滤器在事件捕获期间触发,而 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])。
参考文献
我不确定你在用
getApplication
做什么,但只是为了证明 KeyEventHandler
在 Scene
上有效,这里有一个演示给你。
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);
}
}
我刚刚开始学习javaFX,所以希望能帮助像我这样的人:)
这里是如何退出应用程序的组合键示例。您可以执行任何您想要的操作。
首先,初始化一个控制器(可以是按钮或菜单项)
MenuItem quit = new MenuItem("Quit");
第二,设置事件处理程序
quit.setOnAction(new EventHandler() {
@Override public void handle(ActionEvent e) {
// quit/close app
primaryStage.close();
}
});
然后设置Accelerator来执行一个动作
quit.setAccelerator(new KeyCodeCombination(KeyCode.E, KeyCombination.CONTROL_DOWN));
这里有详细教程
https://blog.idrsolutions.com/2014/04/tutorial-how-to-setup-key-combinations-in-javafx/
希望有帮助:)
这是一个按钮的示例,但当然它会加深您的目标。
private void setSaveAccelerator(final Button button, final KeyCodeCombination keyCodeCombination) {
if (button == null) {
throw new IllegalArgumentException("button cannot be null");
Scene scene = button.getScene();
if (scene == null) {
throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene");
}
scene.getAccelerators().put(keyCodeCombination,
// referance of the fire methode of the button, which is a runable
button::fire);
}