在 Swing 中禁用按键重复

Disabling key repeat in Swing

我正在开发一个 Java/Swing 应用程序,我正在 JFrame.

上使用 KeyListener 自己处理关键事件

我的问题是,OS 的按键重复功能导致当我按住一个键时发生多个 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() returns int。)另一个问题是按下一个键,在另一个 window 中释放它,然后在我的应用程序中再次按下它不会注册事件.

所以,有没有更好的方法

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