JavaFX检测同时按下的多个键盘按键

2024-04-18

正如标题所说,我想检测同时按下的多个键盘按键(同时地)并被按下(同时地)一段时间。我正在尝试添加多个事件处理程序Scene但它不起作用:

EventHandler<KeyEvent> handler1 = key -> {
     //logic1 here
}

EventHandler<KeyEvent> handler2 = key -> {
     //logic1 here
}

getScene().addEventHandler(KeyEvent.KEY_PRESSED, handler1);
getScene().addEventHandler(KeyEvent.KEY_PRESSED, handler2);

为什么我要这样做:

我有一些代码,我想根据以下内容调整矩形的大小keyboard keys由用户按下。例如,如果用户按下RIGHT ARROW矩形从右侧增加,如果用户按下UP ARROW矩形从顶部开始增大。

问题:

但是当用户按下 [RIGHT ARROW] and [UP ARROW] 同时按住它们,上述两个动作必须同时发生,而不仅仅是其中之一。


只需操作一些布尔属性:

private BooleanProperty upPressed = new SimpleBooleanProperty();
private BooleanProperty rightPressed = new SimpleBooleanProperty();

private BooleanBinding anyPressed = upPressed.or(rightPressed);

// ...

getScene().setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.UP) {
        upPressed.set(true);
    }
    if (e.getCode() == KeyCode.RIGHT) {
        rightPressed.set(true);
    }
});

getScene().setOnKeyReleased(e -> {
    if (e.getCode() == KeyCode.UP) {
        upPressed.set(false);
    }
    if (e.getCode() == KeyCode.RIGHT) {
        rightPressed.set(false);
    }
});

如果同时按下两个键,则两个属性都将为 true,因此您可以使用布尔属性注册侦听器,或者在AnimationTimer根据您的需要,例如:

double delta = .. ;

AnimationTimer timer = new AnimationTimer() {
    @Override
    public void handle(long timestamp) {
        if (upPressed.get()) {
            rect.setY(rect.getY()-delta);
            rect.setHeight(rect.getHeight() + delta);
        }
        if (rightPressed.get()) {
            rect.setWidth(rect.getWidth() + delta);
        }
    }
};

anyPressed.addListener((obs, wasPressed, isNowPressed) -> {
    if (isNowPressed) {
        timer.start();
    } else {
        timer.stop();
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX检测同时按下的多个键盘按键 的相关文章

随机推荐