我在 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(使用前将#替换为@)