禁用Swing中的按键重复

4
我正在开发一款Java/Swing应用程序,并且正在使用JFrame上的KeyListener来处理键盘事件。
我的问题是,操作系统的按键重复功能会在我按住一个键时导致多个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>жӣҝжҚўжӮЁзҡ„еёғе°”ж•°з»„гҖӮй”®зӣҳйҮҚеӨҚжҳҜж“ҚдҪңзі»з»ҹзҡ„еҠҹиғҪпјҢеӣ жӯӨж— жі•зҰҒз”Ёе®ғпјҢеҸӘиғҪеҜ№е…¶иҝӣиЎҢеӨ„зҗҶгҖӮ - VGR
@VGR,我最终用WindowFocusListener的方式解决了这个问题,在失去焦点时清除按下的键。请将其作为答案发布,我会接受它。 - PurkkaKoodari
1个回答

3

将您的布尔数组替换为HashSet<Integer>TreeSet<Integer>。重复键是操作系统的一个功能,所以没有办法禁用它,只能考虑它。


实际上,在Linux下,您可以使用“xset -r”禁用它(如果在X11下)。不确定这对于真实世界的应用程序是否非常有用(我不希望被迫禁用键盘自动重复仅仅是为了使用某些软件)。 - ljleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接