【问题标题】:Multiple Key press event abuse in WindowsWindows 中的多个按键事件滥用
【发布时间】:2017-04-18 19:57:30
【问题描述】:

我正在尝试使用 JavaFx onKeyPressed 事件复制动作游戏多次按键的行为,我注意到每个基于 Windows 的键盘输入处理程序中似乎都会出现一些更普遍的问题,即: 想要的行为:

用户按住“W” - 检测/打印 W 键 用户在按住“W”的同时按住其他键“R” - 检测到“W”,然后检测到“R”。 当“R”被释放时,“W”在他被释放之前仍然应该被检测到。

真正发生的事情: 打开任何编辑器并按这些键先按住W然后按住R,它会打印出类似的内容:

WWWWWWWWWWRRRRRRRRRRRR

虽然想要的行为是:

WRWRWRWRWRWRWRWRWRWRWR

此外,当 R 发布时 - W 根本不会被打印! 现在我正在使用 JavaFx 键事件检测,我猜测它基于 Windows 键事件检测,我知道我可以为此做一些解决方法来检测所有键(在发布时使用堆栈和弹出键)但我想知道是这是配置问题还是我遗漏了什么? 你可以看到,在大多数电脑游戏中,这个问题都得到了解决,即当你按下运行并输入一些不敬的键时,你会继续在游戏中运行。

【问题讨论】:

    标签: windows javafx user-input


    【解决方案1】:

    只能保证按键会触发一次事件,而不是只要按键按下,它就会重复触发事件。因此,您应该注意自己保存按下的键,并且根据状态的更新应该从AnimationTimer 或在适当延迟后在应用程序线程上重复执行的其他代码触发。

    例子:

    final Set<KeyCode> activeKeys = EnumSet.noneOf(KeyCode.class);
    final AnimationTimer updater = new AnimationTimer() {
    
        @Override
        public void handle(long now) {
            // print all pressed keys
            for (KeyCode code : activeKeys) {
                System.out.println(code);
            }
        }
    };
    
    scene.setOnKeyPressed(evt -> {
        boolean wasEmpty = activeKeys.isEmpty();
        if (activeKeys.add(evt.getCode()) && wasEmpty) {
            updater.start();
        }
    });
    
    scene.setOnKeyReleased(evt -> {
        if (activeKeys.remove(evt.getCode()) && activeKeys.isEmpty()) {
            updater.stop();
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2011-11-02
      • 2019-12-17
      相关资源
      最近更新 更多