【问题标题】:Java Swing - Pressed key gets not released (sometimes)Java Swing - 按下的键未被释放(有时)
【发布时间】:2011-07-18 10:41:24
【问题描述】:

对于游戏,我使用KeyListener 来了解按键何时被按下。

public synchronized void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        keyRightIsDown = true;
    }
}

public synchronized void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        keyRightIsDown = false;
    }
}

这工作 99.9%。但有时(经常),keyReleased 没有被调用,当释放键时(导致游戏角色继续向右移动 - 再次按下键可以解决问题)。

[也许相关:]我使用 OSX 10.6,我经常同时按下多个键。

我怎样才能使这项工作 100% ?

【问题讨论】:

  • 我怀疑发生了乱序事件(即您在按下快速按键之前获得释放)。你能数一数事件的数量,看看你获得的发布数量是否与新闻发布数量相同?
  • @Alexander:我会试着找出答案。我该如何解决?
  • 为每个键保留一个计数器,当您收到按下事件时递增,当您获得释放时递减。当 count 0 或 >0 时考虑按下键,具体取决于您希望代码的行为方式(将无序视为有序,或忽略无序)。如果你不关心它们,你也可以过滤掉快速按下。

标签: java swing keylistener


【解决方案1】:

可能会更好地查看KeyBindings,这很容易将Listener 构建为KeyListener 的关键操作

【讨论】:

    【解决方案2】:

    类似的问题被问过好几次了,看看

    how-to-know-when-a-user-has-really-released-a-key-in-java

    how-to-stop-repeated-keypressed-keyreleased-events-in-swing

    我希望这会有所帮助;

    编辑:

    你可以做的是使用轮询机制:

    static Toolkit kit = Toolkit.getDefaultToolkit();
    ..
    if (kit.getLockingKeyState(KeyEvent.VK_X))
    ..
    

    这意味着如果按下某个键,您总是会签入您的线程。 但请记住,轮询效率不高。

    【讨论】:

    • 我没有收到很多已发布的事件,我丢失了一个(或者事件触发的顺序混淆了)。
    猜你喜欢
    • 2012-05-19
    • 2012-01-21
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多