如何在单个场景中检测到多个关键事件? 我需要我的程序来检测何时同时按下空格键和右箭头键。
scene.setOnKeyPressed(new EventHandler<KeyEvent>() { public void handle(KeyEvent ke) { if (ke.getCode() == KeyCode.RIGHT) { /// } if (ke.getCode() == KeyCode.LEFT) { /// } if (ke.getCode() == KeyCode.SPACE) { /// } if (ke.getCode() == KeyCode.RIGHT && ke.getCode() == KeyCode.SPACE) { // How?? } } });前3个表达式寻找单个键并且工作正常。 最后的表达式永远不会返回true。 我相信只有最新的关键事件才会传递给处理程序。
我查看了KeyCodeCombination ,但这似乎是在密钥具有来自指定列表(ALT_DOWN,SHIFT_DOWN等)的修饰键的情况下使用的。
我可以使用FX中的实用程序吗?
How are multiple key events detected in a single scene? I need my program to detect when the space bar and the right arrow keys are pressed simultaneously.
scene.setOnKeyPressed(new EventHandler<KeyEvent>() { public void handle(KeyEvent ke) { if (ke.getCode() == KeyCode.RIGHT) { /// } if (ke.getCode() == KeyCode.LEFT) { /// } if (ke.getCode() == KeyCode.SPACE) { /// } if (ke.getCode() == KeyCode.RIGHT && ke.getCode() == KeyCode.SPACE) { // How?? } } });The first 3 expressions look for a single key and work fine. The final expression never returns true. I believe only the latest key event is passed to the handler.
I looked at KeyCodeCombination, however this appears to be for use in cases when a key has a modifier key from a specified list (ALT_DOWN, SHIFT_DOWN, etc).
Is there a utility in FX that I can use?
最满意答案
尝试这个:
final BooleanProperty spacePressed = new SimpleBooleanProperty(false); final BooleanProperty rightPressed = new SimpleBooleanProperty(false); final BooleanBinding spaceAndRightPressed = spacePressed.and(rightPressed); // How to respond to both keys pressed together: spaceAndRightPressed.addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<Boolean> obs, Boolean werePressed, Boolean arePressed) { System.out.println("Space and right pressed together"); } }); // Wire up properties to key events: scene.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode() == KeyCode.SPACE) { spacePressed.set(true); } else if (ke.getCode() == KeyCode.RIGHT) { rightPressed.set(true); } } }); scene.setOnKeyReleased(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode() == KeyCode.SPACE) { spacePressed.set(false); } else if (ke.getCode() == KeyCode.RIGHT) { rightPressed.set(false); } } });Try this:
final BooleanProperty spacePressed = new SimpleBooleanProperty(false); final BooleanProperty rightPressed = new SimpleBooleanProperty(false); final BooleanBinding spaceAndRightPressed = spacePressed.and(rightPressed); // How to respond to both keys pressed together: spaceAndRightPressed.addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<Boolean> obs, Boolean werePressed, Boolean arePressed) { System.out.println("Space and right pressed together"); } }); // Wire up properties to key events: scene.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode() == KeyCode.SPACE) { spacePressed.set(true); } else if (ke.getCode() == KeyCode.RIGHT) { rightPressed.set(true); } } }); scene.setOnKeyReleased(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode() == KeyCode.SPACE) { spacePressed.set(false); } else if (ke.getCode() == KeyCode.RIGHT) { rightPressed.set(false); } } });更多推荐
发布评论