gpt4 book ai didi

JavaFX 如何区分 keyPressed X 和 Keys X + Y 的组合

转载 作者:行者123 更新时间:2023-12-04 09:43:41 25 4
gpt4 key购买 nike

我希望我的应用程序 (JavaFx 14) 在按下“a”键时执行某些操作,并且我还希望应用程序在按下具有相同键“a”和“b”的组合键时执行某些操作。目标是只调用一种方法。按 a 的方法或按 a + b 的方法。我尝试使用带有键码的可观察列表来执行此操作,但所有方法都被调用。

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

private void keyboardShortcuts(Button[] buttons){

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

e.consume();
});

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

e.consume();
});

keys.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {


if(keys.size() == 1) {

if(keys.contains(KeyCode.A)) {
foo();
}
if(keys.contains(KeyCode.B)) {
foo2();
}

}
if(keys.size() == 2) {

if(keys.contains(KeyCode.A) && keys.contains(KeyCode.B)) {
foo3();
}

}
}
});
}

最佳答案

当用户“按下两个键”时,两个按键不可能同时发生,因此其中一个按键必须先于另一个被检测到。这里最好的方法可能是确保其中一个键(比如 B)没有它自己的功能。这样,用户将学会总是先按 B,然后在按住 B 的同时按 A(这是我们键入的方式,使用修改键,例如 SHIFT 和 CTRL)。

如果您真的希望两个键都具有自己的功能,但是在“同时”按下两个键时功能不同,那么您唯一的选择是在处理单个键的按下时实现延迟,等待查看另一个在延迟到期之前按下键。当然,这是以牺牲响应能力为代价的。

这是一个实现,使用短(25ms)PauseTransition对于延迟。 (我也改为使用 ObservableSet ,它清理了一些逻辑。)

private ObservableSet<KeyCode> keys = FXCollections.observableSet();
private PauseTransition keyDelay = new PauseTransition(Duration.millis(25));

private void keyboardShortcuts(Scene scene){

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

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

keys.addListener((Change<? extends KeyCode> c) -> {
if (keys.size() <= 1) {
keyDelay.playFromStart();
} else {
keyDelay.stop();
checkKeys();
}
});
keyDelay.setOnFinished(e -> checkKeys());

}

private void checkKeys() {

if(keys.contains(KeyCode.A) && keys.contains(KeyCode.B)) {
System.out.println("A and B");
} else if(keys.contains(KeyCode.A)) {
System.out.println("A only");
} else if(keys.contains(KeyCode.B)) {
System.out.println("B only");
}
}

关于JavaFX 如何区分 keyPressed X 和 Keys X + Y 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62215729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com