2016-05-27 46 views
1

我正在開發一個Java/Swing應用程序,我正在使用我的JFrame上的KeyListener來處理重要事件。在Swing中禁用密鑰重複

我的問題是,當我按住一個鍵時,操作系統的鍵重複功能導致多個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〜2 -1,我不知道是否可以存在超出這個範圍的。 (getKeyCode()返回int。)另一個問題是,按下某個鍵,在另一個窗口中釋放它,然後在我的應用程序中再次按下它將不會註冊該事件。

那麼,有沒有更好的辦法來無論是在我的應用程序

  • 禁用鍵重複或
  • 檢測重複可靠的事件?
+0

用'HashSet '或'TreeSet '替換你的布爾數組。關鍵重複是操作系統的功能,所以無法禁用它,只能解決它。 – VGR

+0

@VGR我最終這樣做了,用'WindowFocusListener'來清除失去焦點時按下的按鍵。作爲回答,我會繼續接受它。 – Pietu1998

回答

3

用或TreeSet<Integer>替換您的布爾值數組。關鍵重複是操作系統的功能,所以無法禁用它,只能解決它。