我注意到JavaFX(系统)菜单上的菜单加速器有一种非常奇怪的行为。某些组合键根本不起作用,而其他组合键则被解释为错误键。
例如,当您使用CMD + CLEAR键作为加速器时,它将作为CMD + Page Down down键(在菜单文本和对键盘事件的实际响应中)进行更改。 ' - '(MINUS)键完全不能正常工作,而CMD + - 在菜单中显示良好,当你按下键时它永远不会被触发。另一方面,当你添加ALT键(即你按下CMD + ALT + - )时,CMD-事件会被触发(但不是CMD + ALT + - 一个)。
知道发生了什么,或者这是一个(知道的)错误?
我创建了以下示例程序来说明这一点。 注意:我在Mac上。
package menuaccelerator;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class MenuAccelerator extends Application {
// Counter for the event number
int eventNr = 0;
@Override
public void start(Stage primaryStage) {
// Text Area for displaying the events
TextArea events = new TextArea();
events.setEditable(false);
events.setOnKeyPressed((e) -> {
System.out.println("Key Event(" + ++eventNr + "): " + e);
events.appendText((eventNr == 1 ? "" : "\n") + "KeyCode(" + eventNr + "): " + e.getCode());
e.consume();
});
// Menu Bar & Menu
MenuBar menuBar = new MenuBar();
menuBar.setUseSystemMenuBar(true);
Menu menu = new Menu("Accelerator Test");
menuBar.getMenus().add(menu);
// Build menu
for (String item : new String[]{"Shortcut+PLUS", "Shortcut+Alt+PLUS",
"Shortcut+MINUS", "Shortcut+Alt+MINUS",
"Shortcut+PAGE__UP", "Shortcut+Alt+PAGE__UP",
"Shortcut+PAGE__DOWN", "Shortcut+Alt+PAGE__DOWN",
"Shortcut+CLEAR"}) {
MenuItem menuItem = new MenuItem(item);
menuItem.setAccelerator(KeyCombination.keyCombination(item));
menuItem.setOnAction((ActionEvent e) -> {
System.out.println("Menu Event(" + ++eventNr + "): " + e);
events.appendText((eventNr == 1 ? "" : "\n") + "Menu Event(" + eventNr + "): " + ((MenuItem) e.getSource()).getText());
e.consume();
});
menu.getItems().add(menuItem);
}
// Create scene
StackPane root = new StackPane();
VBox vbox = new VBox(10);
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().add(events);
root.getChildren().add(vbox);
root.getChildren().add(menuBar);
Scene scene = new Scene(root, 300, 200);
// Display scene
primaryStage.setTitle("Accelerator Test");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}