JavaFX奇怪的菜单加速器行为

时间:2015-08-16 10:12:26

标签: java menu javafx keyboard-shortcuts javafx-8

我注意到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);
    }

}

0 个答案:

没有答案