我正在开发一款Java/Swing应用程序,并且正在使用JFrame上的KeyListener来处理键盘事件。
我的问题是,操作系统的按键重复功能会在我按住一个键时导致多个keyPressed事件发生,而我只想收到一个事件。
其中一个解决方案是将按键状态保存在数组中,并仅在状态发生变化时接受事件。
这个方法可行,但非常笨拙。虽然我似乎只能在0到216-1的范围内找到键码,但我不确定是否存在超出此范围的键码。(
所以,有没有更好的方法来:
我的问题是,操作系统的按键重复功能会在我按住一个键时导致多个keyPressed事件发生,而我只想收到一个事件。
其中一个解决方案是将按键状态保存在数组中,并仅在状态发生变化时接受事件。
private boolean keysDown[] = new boolean[0x10000];
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (0 <= key && key <= 0xFFFF) {
if (keysDown[key]) return;
keysDown[key] = true;
}
// ...
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (0 <= key && key <= 0xFFFF) {
if (!keysDown[key]) return;
keysDown[key] = false;
}
// ...
}
这个方法可行,但非常笨拙。虽然我似乎只能在0到216-1的范围内找到键码,但我不确定是否存在超出此范围的键码。(
getKeyCode()
返回int
。)另一个问题是,按下一个键,在另一个窗口释放它,然后再次在我的应用程序中按下它时,事件将无法被注册。所以,有没有更好的方法来:
- 禁用在我的应用程序中的键盘重复或
- 可靠地检测重复事件?
HashSet<Integer>
жҲ–TreeSet<Integer>
жӣҝжҚўжӮЁзҡ„еёғе°”ж•°з»„гҖӮй”®зӣҳйҮҚеӨҚжҳҜж“ҚдҪңзі»з»ҹзҡ„еҠҹиғҪпјҢеӣ жӯӨж— жі•зҰҒз”Ёе®ғпјҢеҸӘиғҪеҜ№е…¶иҝӣиЎҢеӨ„зҗҶгҖӮ - VGRWindowFocusListener
的方式解决了这个问题,在失去焦点时清除按下的键。请将其作为答案发布,我会接受它。 - PurkkaKoodari