JavaFX奇怪的菜单加速器行为

我注意到JavaFX(系统)菜单上的菜单加速器有一个非常奇怪的行为。 某些组合键根本不起作用,而其他键组合则被解释为错误键。

例如,当您使用CMD + CLEAR键作为加速器时,它将作为CMD + Page Down down键(在菜单文本和对键盘事件的实际响应中)进行更改。 ‘ – ‘(MINUS)键完全不能正常工作,而CMD + – 在菜单中显示良好,按键时永远不会触发。 另一方面,当您添加ALT键(即,按CMD + ALT + – )时,CMD事件会被触发(但不会触发CMD + ALT + – 1)。

知道发生了什么,或者这是一个(知道)错误?

我创建了以下示例程序来说明这一点。 注意:我在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); } }