2

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

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

这是我的代码:

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;
    }
}  
4

1 回答 1

3

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

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

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

  • 使用 anenum来持有keyCodes;该游戏使用单次击键,但它说明了如何在这种情况下使用 an enum

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

于 2012-06-30T02:01:05.533 回答