如何创建具有三个或更多键的JavaFX键组合?

如何创建具有三个或更多键的JavaFX键组合?,javafx,keyboard-shortcuts,Javafx,Keyboard Shortcuts,我正在用JavaFX创建一个简单的文本编辑器。 我发现我可以使用 MenuItem.setAccelerator(KeyCombination.keyCombination("Ctrl+S")) 我将把它用于我的应用程序中经常使用的MenuItems,例如Save、Open等。只要我只使用两个键,例如Ctrl+s,这就行了,但我还想创建一些三个键的组合,例如Save All选项,在许多程序中,它有快捷键Ctrl+s+A(与Save相同,但有一个额外的A,逻辑上表示All) 这带来了一个问题。

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

MenuItem.setAccelerator(KeyCombination.keyCombination("Ctrl+S"))
我将把它用于我的应用程序中经常使用的
MenuItem
s,例如Save、Open等。只要我只使用两个键,例如Ctrl+s,这就行了,但我还想创建一些三个键的组合,例如Save All选项,在许多程序中,它有快捷键Ctrl+s+A(与Save相同,但有一个额外的A,逻辑上表示All)

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

我一直使用谷歌,但我找不到任何关于使用两个以上键的信息,所以我决定在这里问一个问题

我想知道如何在JavaFX中设置两个以上的键(目前我需要三个)作为
菜单项的快捷方式。

问题是,只有一个键。 因此,不可能让一个键组合匹配多个键代码

但您可以尝试以下方法:

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

@覆盖
公共void初始化(URL位置、ResourceBundle资源){
scene.setOnKeyPressed((事件)->{
add(event.getCode());
});
scene.setOnKeyReleased((事件)->{
移除(event.getCode());
});
}
编写自己的KeyCombi类

私有类MultipleKeyCombi扩展密钥组合{
私有列表所需代码;
公共多密钥组合(密钥码…密钥码){
neededCodes=数组.asList(代码);
}
@凌驾
公共布尔匹配(KeyEvent事件){
返回代码。包含所有(需要的代码);
}
}
并在菜单中使用它

item.setAccelerator(new MultipleKeyCombi(KeyCode.A, KeyCode.S));
这应该行得通


我在这里编写了一个原型

我解决了这个问题,只需在退出舞台窗口的同时按Ctrl+S

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

这是我的贡献。基本上,这会捕获按下的键并将它们收集到
可观察列表中,然后在释放键时将其从列表中删除

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

下面是一个实现它的示例:

    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");

                }
            }
        });
    }
private observeList key=FXCollections.observearraylist();
私有无效键盘快捷键(){
//收集按下的键
scene.addEventFilter(按KeyEvent.KEY_,事件)->{
如果(!keys.contains(event.getCode())){
add(event.getCode());
}
event.consume();
});
//松开按键时,将其拔下
scene.setOnKeyReleased((事件)->{
keys.remove(event.getCode());
event.consume();
});
addListener(新的invalizationListener(){
@凌驾
公共无效(可观察到){
如果(keys.size()==3//此数字对于确保按下的键不超过所需的键数非常重要
//检测按下的控制(windows)或命令(mac)键
&&(keys.contains(KeyCode.CONTROL)| keys.contains(KeyCode.COMMAND))
&&keys.contains(KeyCode.SHIFT)
&&键.包含(键代码.A)){
System.out.println(“另存为”);
}
else if(keys.size()==2//此数字对于确保按下的键不超过我们想要的键数非常重要
&&(keys.contains(KeyCode.CONTROL)| keys.contains(KeyCode.COMMAND))
&&keys.contains(KeyCode.O)){
System.out.println(“打开”);
}
}
});
}

我也是JavaFX新手,我已经完成了下面的代码,它可以工作了

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

没有快速简便的方法获取
Ctrl+S+A
,但您可能希望使用
Shift+Ctrl+S
,这通常用于保存所有内容。您可以使用多个修改器键(Shift、Control、Alt、Meta)在组合键中。@TomasMikula我想你是对的。我会选择
Shift+Ctrl+S
。谢谢!组合键。组合键(“Ctrl+S+a”)也有效吗?因为这是他面临的问题。