如何使用三个或更多键创建JavaFX KeyCombination?

时间:2015-03-15 18:02:43

标签: javafx keyboard-shortcuts

我正在使用 JavaFX 创建一个简单的文本编辑器 我发现我可以使用

添加菜单项的快捷方式
MenuItem.setAccelerator(KeyCombination.keyCombination("Ctrl+S"))

我将把它用于我的应用程序中经常使用的MenuItem,例如保存打开等。这样可以正常工作因为我只使用两个键,例如 Ctrl + S ,但我还想创建一些包含三个键的组合,例如全部保存选项,在许多程序中都有快捷键 Ctrl + S + A (与保存相同,但是额外的 A ,逻辑上代表 All )。

这带来了一个问题 JavaFX不允许我使用KeyCombination.keyCombination(String)方法使用两个以上的键。我在运行应用程序时遇到错误。

我一如既往地使用Google,但我找不到关于使用两个以上密钥的任何,所以我决定在这里提问。

我想知道如何设置两个以上的密钥(我目前需要三个)作为JavaFX中MenuItem的快捷方式。

4 个答案:

答案 0 :(得分:3)

问题是KeyEvent只有一个KeyCode。 因此,不可能让KeyCombination与多个KeyCodes匹配。

但你可以尝试这样的事情:

将所有按下的键存储到列表中(可能您必须使用事件监听器进行按键)

@Override
public void initialize(URL location, ResourceBundle resources) {
    scene.setOnKeyPressed((event) -> {
        codes.add(event.getCode());
    });
    scene.setOnKeyReleased((event) -> {
        codes.remove(event.getCode());
    });
}

编写自己的KeyCombi类

    private class MultipleKeyCombi extends KeyCombination {
    private List<KeyCode> neededCodes;
    public MultipleKeyCombi (KeyCode... codes) {
        neededCodes = Arrays.asList(codes);
    }

    @Override
    public boolean match(KeyEvent event) {
        return codes.containsAll(neededCodes);
    }
}

并在菜单中使用它。

item.setAccelerator(new MultipleKeyCombi(KeyCode.A, KeyCode.S));

这应该有用。

我在这里写了一个Prototype Bitbucket Repo

答案 1 :(得分:0)

我通过在退出舞台窗口的同时按Ctrl + S解决了问题。

primaryStage.setFullScreenExitKeyCombination(KeyCombination.keyCombination("Ctrl+S"));

答案 2 :(得分:0)

这是我的贡献。基本上,这会捕获按下的键并将它们收集到ObservableList<Keycode>中,并在释放键时将其从列表中删除。

然后,在更改事件时,它会检测存储密钥的标识符/变量的内容。

以下是实施它的示例:

    private ObservableList<KeyCode> keys = FXCollections.observableArrayList();
    private void keyboardShortcuts(){

        // collect pressed key
        scene.addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
            if (!keys.contains(event.getCode())) {
                keys.add(event.getCode());
            }
            event.consume();
        });

        // remove pressed key when it is released   
        scene.setOnKeyReleased((event) -> {
            keys.remove(event.getCode());
            event.consume();
        });

        keys.addListener(new InvalidationListener() {
            @Override
            public void invalidated(Observable observable) {
                if( keys.size() == 3 // this number is important to make sure the pressed key don't exceed the number of keys we want

                // detect control (windows) or command (mac) key pressed
                && (keys.contains(KeyCode.CONTROL) || keys.contains(KeyCode.COMMAND)) 
                && keys.contains(KeyCode.SHIFT)
                && keys.contains(KeyCode.A)){

                    System.out.println("Save As");

                }
                else if( keys.size() == 2 // this number is important to make sure the pressed key don't exceed the number of keys we want
                &&(keys.contains(KeyCode.CONTROL) || keys.contains(KeyCode.COMMAND))
                && keys.contains(KeyCode.O)){

                    System.out.println("Open");

                }
            }
        });
    }

答案 3 :(得分:0)

我也是JavaFX的新手,我已经完成了以下代码并且它有效!

primaryStage.getScene().getAccelerators().put(
        KeyCombination.keyCombination("CTRL+SHIFT+U"),
        new Runnable() {
            @Override
            public void run() {
                System.out.println("Keycombination Detected");
            Platform.exit();
            }
        }
        );