我正在开发Java / Swing应用程序,并使用KeyListener上的JFrame自己处理关键事件。

我的问题是,当我只想接收一个按键时,操作系统的按键重复功能会导致发生多个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>。重复键是操作系统的功能,因此无法禁用它,只能解决它。

    07-24 13:10