在默認情況下,長按鍵盤不放會重複觸發 `keyPressed` 事件(伴隨 `keyReleased` 只在鬆開時觸發一次)。重複觸發的頻率和延遲由**操作系統鍵盤重複率設置**決定,非Java層面可直接控制。
長按 'A' 鍵 500ms (假設重複率 30次/秒,延遲 250ms):
1. keyPressed (A) // 首次按下
2. keyTyped (A) // 字符輸入
--- 250ms 延遲 ---
3. keyPressed (A) // 重複 1
4. keyTyped (A)
--- 33ms 間隔 ---
5. keyPressed (A) // 重複 2
6. keyTyped (A)
...
N. keyReleased (A) // 鬆開時觸發一次
若業務邏輯要求「長按只響應一次」(如遊戲移動、快捷鍵),需在事件處理中**過濾重複**:
private Set pressedKeys = ConcurrentHashMap.newKeySet();
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (pressedKeys.contains(code)) {
return; // 忽略重複觸發
}
pressedKeys.add(code);
// 業務邏輯...
}
public void keyReleased(KeyEvent e) {
pressedKeys.remove(e.getKeyCode());
}
| 事件 | 觸發時機 | 重複觸發 | 獲取字符 | 典型用途 |
|---|---|---|---|---|
| keyPressed | 按鍵按下 | 是(系統級) | 否(只有虛擬鍵碼) | 遊戲控制、快捷鍵、非字符鍵 |
| keyReleased | 按鍵鬆開 | 否 | 否 | 釋放資源、停止移動 |
| keyTyped | 字符輸入 | 是(跟隨Pressed) | 是 (`e.getKeyChar()`) | 文本輸入框、字符過濾 |