按住字母键后,Java KeyListener 不再触发按键事件

2023-11-29

我在 Java 中的 KeyListener 上遇到问题,当按住字母键(例如“s”或“a”)时,我第一次正确获取按键事件(keyPressed、keyTyped、keyReleased)但是下次我去按键盘上的任意键(字母或非字母)我只得到一个 keyReleased 事件。

应该注意的是,按住箭头键不会导致按键监听器停止工作,按下字母键也不会。仅按住字母键会阻止按键侦听器将来对任何键进行操作,并且 keyReleased 事件永远不会停止工作。

我还应该注意到,字母键似乎没有重复 keyPress 事件,而按住方向键会导致在按住方向键时重复 keyPress 事件。

这是我用来跟踪关键状态的类。我在关键侦听器事件上有 println 语句来尝试和调试。

我已经为此苦苦挣扎了一段时间,非常感谢您能提供的任何帮助。谢谢。

  public class KeyboardInput implements KeyListener { 

  private static final int KEY_COUNT = 256;   

  private enum KeyState {

    RELEASED, // Not down

    PRESSED,  // Down, but not the first time

    ONCE      // Down for the first time

  }

  // Current state of the keyboard

  private boolean[] currentKeys = null;

  // Polled keyboard state

  private KeyState[] keys = null;

  public KeyboardInput() {

    currentKeys = new boolean[ KEY_COUNT ];

    keys = new KeyState[ KEY_COUNT ];

    for( int i = 0; i < KEY_COUNT; ++i ) {

      keys[ i ] = KeyState.RELEASED;

    }

  }

  public synchronized void poll() {

    for( int i = 0; i < KEY_COUNT; ++i ) {

      // Set the key state 

      if( currentKeys[ i ] ) {

        // If the key is down now, but was not

        // down last frame, set it to ONCE,

        // otherwise, set it to PRESSED

        if( keys[ i ] == KeyState.RELEASED )

          keys[ i ] = KeyState.ONCE;

        else

          keys[ i ] = KeyState.PRESSED;

      } else {

        keys[ i ] = KeyState.RELEASED;

      }

    }

  }

  public boolean keyDown( int keyCode ) {

    return keys[ keyCode ] == KeyState.ONCE ||

           keys[ keyCode ] == KeyState.PRESSED;

  }

  public boolean keyDownOnce( int keyCode ) {

    return keys[ keyCode ] == KeyState.ONCE;

  }

  public synchronized void keyPressed( KeyEvent e ) {
    System.out.println("Press " + e.getKeyChar());
    int keyCode = e.getKeyCode();
    if( keyCode >= 0 && keyCode < KEY_COUNT ) {
      currentKeys[ keyCode ] = true;
    }
  }

  public synchronized void keyReleased( KeyEvent e ) {
    System.out.println("release " + e.getKeyChar());
    int keyCode = e.getKeyCode();
    if( keyCode >= 0 && keyCode < KEY_COUNT ) {
      currentKeys[ keyCode ] = false;
    }
  }

  public void keyTyped( KeyEvent e ) {
      System.out.println("type " + e.getKeyChar());
  }
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按住字母键后,Java KeyListener 不再触发按键事件 的相关文章

随机推荐