【问题标题】:KeyEvent not firing when certain other keys are pressed按下某些其他键时 KeyEvent 未触发
【发布时间】:2012-07-01 10:49:41
【问题描述】:

我在 Java 中遇到了更多关键问题。 SPACE 键事件本身就可以正常工作,并且当按下其他键时...

但是,如果我同时按下 UP 键和 LEFT 键,则不会触发 SPACE 事件。但是,如果单独按下 LEFTUP 或与其他键一起按下,则 SPACE 会触发。

这是我的代码:

public void keyPressed(KeyEvent e) 
{
    if(e.getKeyCode() == KeyEvent.VK_UP)
    {
        upkeyisdown = true;         
    }
    if(e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        downkeyisdown = true;
    }
    if(e.getKeyCode() == KeyEvent.VK_LEFT)
    {
        leftkeyisdown = true;
    }
    if(e.getKeyCode() == KeyEvent.VK_RIGHT)
    {
        rightkeyisdown = true;
    }
    if(e.getKeyCode() == KeyEvent.VK_SPACE)
    {
        spacekeyisdown = true;
    }

}  
public void keyReleased(KeyEvent e) 
{
    if(e.getKeyCode() == KeyEvent.VK_UP)
    {
        upkeyisdown = false;            
    }

    if(e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        downkeyisdown = false;
    }
    if(e.getKeyCode() == KeyEvent.VK_LEFT)
    {
        leftkeyisdown = false;
    }
    if(e.getKeyCode() == KeyEvent.VK_RIGHT)
    {
        rightkeyisdown = false;
    }
    if(e.getKeyCode() == KeyEvent.VK_SPACE)
    {
        spacekeyisdown = false;
    }
}  

【问题讨论】:

标签: java swing awt keylistener keyevent


【解决方案1】:

KeyEvent 中所述,不支持同时发生多个KEY_PRESSEDKEY_RELEASED 事件。这同样适用于KeyStroke。您可以绑定到包含修饰符的KeyStroke 实例,如here 所示。修饰符可能包括“alt、shift、control、meta、altGraph 或其组合”。

附录:“如果我同时按下 UP 键和 LEFT 键,则不会触发 SPACE 事件。 "

使用来自How to Write a Key ListenerKeyEventDemo,我看到了预期的KEY_PRESSEDKEY_RELEASED 事件。顺序会有所不同,因为事件实际上不能“同时”发生,尽管KEY_PRESSED 可靠地先于KEY_RELEASED。我怀疑您的代码中其他地方存在逻辑错误。管理复杂性的一种方法是

  • 使用enum 保存keyCodes;这个game 使用单次击键,但它说明了如何在这种情况下使用enum

  • 使用EnumSets 包含可识别的组合;有一个相关的例子here

【讨论】:

  • 嗯,通过使用布尔值,我有一种多按键系统。这个系统很好用,它只是与 UP、LEFT 和 SPACE 的组合很时髦......但所有其他组合都有效。
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多