不要使用KeyListener
s,作爲一般規則,它們所連接的組件必須具有鍵盤焦點才能被觸發。
相反,使用一個密鑰綁定...
InputMap im = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getRootPane().getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
am.put("cancel", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
});
更多細節
因爲Action
API的力量見How to Use Key Bindings,我將創建一個基本的「處置」行動開始:
public class DisposeWindowAction extends AbstractAction {
private Window window;
public DisposeWindowAction(Window window) {
this.window = window;
putValue(NAME, "Dispose");
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, 0));
}
public Window getWindow() {
return window;
}
@Override
public void actionPerformed(ActionEvent e) {
getWindow().dispose();
}
}
我然後綁定這個到ActionMap
...
am.put("cancel", new DisposeWindowAction(this));
爲什麼你問?因爲你就可以使用在JMenuItem
S和JButton
s`相同Action
....
JButton disposeButton = new JButton(new DisposeWindowAction(this));
...
(您可以使用Action
的同一個實例,但你的想法),現在用戶有類似三個方法來處理窗口...
見How to Use Actions更多細節
'我不知道這個問題is'什麼 - 你做任何調試?您是否向KeyListener添加了打印語句以查看代碼是否已執行? – camickr
似乎你在EDT上有一個無限循環,會凍結GUI。 [看看這個](https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html) – Titus
我試圖把Thread.sleep(10);在循環內,但它仍然沒有工作 – yj2000