正如标题所说,我想检测同时(同时)按下并同时按下(同时)一段时间的多个键盘按键.我试图添加多个事件处理程序,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);
Run Code Online (Sandbox Code Playgroud)
为什么我要这样做:
我有一些代码,我想根据用户的keyboard keys按下调整矩形的大小.例如,如果用户按下RIGHT ARROW矩形,则从右侧增加,如果用户按下,UP ARROW则矩形从顶部增加.
问题:
但是当用户同时按下[ RIGHT ARROW]和[ 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);
}
});
Run Code Online (Sandbox Code Playgroud)
如果同时按下两个键,则两个属性都为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();
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |