如何创建具有三个或更多键的 JavaFX KeyCombination?
How to create a JavaFX KeyCombination with three or more keys?
我正在使用 JavaFX 创建一个简单的文本编辑器。
我发现我可以使用
向菜单项添加快捷方式
MenuItem.setAccelerator(KeyCombination.keyCombination("Ctrl+S"))
我将把它用于我的应用程序中经常使用的 MenuItem
s,例如 Save、Open 等。只要我只使用两个键就可以正常工作,例如 Ctrl+S,但我也想创建一些组合三个键,例如 Save All 选项,在许多程序中有快捷键 Ctrl+S+A(与 Save 相同,但多了一个 A,逻辑上代表 全部).
这带来了一个问题。
JavaFX 不允许我在 KeyCombination.keyCombination(String)
方法中使用两个以上的键。我在 运行 应用程序时遇到错误。
我一如既往地使用 Google,但我找不到 任何关于使用两个以上键的信息,所以我决定在这里问一个问题.
我想知道如何在 JavaFX 中设置两个以上的键(我目前需要三个)作为 MenuItem
的快捷方式。
问题是KeyEvent only has one KeyCode。
所以不可能让一个KeyCombination匹配多个KeyCodes。
但你可以尝试这样的事情:
将所有按下的键存储到一个列表中(也许您必须为 keyPressed 使用事件监听器)
@Override
public void initialize(URL location, ResourceBundle resources) {
scene.setOnKeyPressed((event) -> {
codes.add(event.getCode());
});
scene.setOnKeyReleased((event) -> {
codes.remove(event.getCode());
});
}
编写自己的 KeyCombi class
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));
这应该有效。
我在这里写了一个原型Bitbucket Repo
我在退出舞台的同时简单地按下 Ctrl + S 就解决了这个问题 window。
primaryStage.setFullScreenExitKeyCombination(KeyCombination.keyCombination("Ctrl+S"));
这是我的贡献。基本上,这会捕获按下的键并将它们收集到 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");
}
}
});
}
我也是 JavaFX 的新手,我已经完成了以下代码并且它有效!
primaryStage.getScene().getAccelerators().put(
KeyCombination.keyCombination("CTRL+SHIFT+U"),
new Runnable() {
@Override
public void run() {
System.out.println("Keycombination Detected");
Platform.exit();
}
}
);
我正在使用 JavaFX 创建一个简单的文本编辑器。
我发现我可以使用
MenuItem.setAccelerator(KeyCombination.keyCombination("Ctrl+S"))
我将把它用于我的应用程序中经常使用的 MenuItem
s,例如 Save、Open 等。只要我只使用两个键就可以正常工作,例如 Ctrl+S,但我也想创建一些组合三个键,例如 Save All 选项,在许多程序中有快捷键 Ctrl+S+A(与 Save 相同,但多了一个 A,逻辑上代表 全部).
这带来了一个问题。
JavaFX 不允许我在 KeyCombination.keyCombination(String)
方法中使用两个以上的键。我在 运行 应用程序时遇到错误。
我一如既往地使用 Google,但我找不到 任何关于使用两个以上键的信息,所以我决定在这里问一个问题.
我想知道如何在 JavaFX 中设置两个以上的键(我目前需要三个)作为 MenuItem
的快捷方式。
问题是KeyEvent only has one KeyCode。 所以不可能让一个KeyCombination匹配多个KeyCodes。
但你可以尝试这样的事情:
将所有按下的键存储到一个列表中(也许您必须为 keyPressed 使用事件监听器)
@Override
public void initialize(URL location, ResourceBundle resources) {
scene.setOnKeyPressed((event) -> {
codes.add(event.getCode());
});
scene.setOnKeyReleased((event) -> {
codes.remove(event.getCode());
});
}
编写自己的 KeyCombi class
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));
这应该有效。
我在这里写了一个原型Bitbucket Repo
我在退出舞台的同时简单地按下 Ctrl + S 就解决了这个问题 window。
primaryStage.setFullScreenExitKeyCombination(KeyCombination.keyCombination("Ctrl+S"));
这是我的贡献。基本上,这会捕获按下的键并将它们收集到 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");
}
}
});
}
我也是 JavaFX 的新手,我已经完成了以下代码并且它有效!
primaryStage.getScene().getAccelerators().put(
KeyCombination.keyCombination("CTRL+SHIFT+U"),
new Runnable() {
@Override
public void run() {
System.out.println("Keycombination Detected");
Platform.exit();
}
}
);