按下某些其他键时KeyEvent不会触发

时间:2012-06-29 22:22:03

标签: java swing awt keylistener keyevent

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

但如果我同时按下 UP 键和 LEFT 键,则 SPACE 事件不会触发。但是,如果单独或使用其他键按 LEFT UP 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;
    }
}  

1 个答案:

答案 0 :(得分:3)

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

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

使用How to Write a Key Listener中的KeyEventDemo,我看到了预期的KEY_PRESSEDKEY_RELEASED事件。订单会有所不同,因为事件实际上并非“同时”发生,尽管KEY_PRESSED可靠地位于KEY_RELEASED之前。我怀疑代码中的其他地方存在逻辑错误。管理复杂性的一种方法是

  • 使用enum保留keyCode个;此game使用单击键,但它说明了如何在此上下文中使用enum

  • 使用EnumSet来包含已识别的组合;有一个相关的例子here