2010-10-21 86 views
1

我有一個名爲NavigationLink一個自定義Swing組件延伸的JLabel並實現了關鍵事件監聽器,像這樣Enter事件:防止冒泡到主窗口

addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     boolean actionInvoked = e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE; 
     if (actionInvoked && NavigationLink.this.clickAction != null) { 
      NavigationLink.this.clickAction.run(); 
     } 
    } 
}); 

clickAction是一個Runnable打開一個JOptionPane.showMessageDialog其包含一個按鈕,「確定」。所有這一切工作正常,問題如下:

  1. 用戶使用Tab直到使用導航到NavigationLink進入焦點
  2. 使用按ENTER鍵,打開對話框消息,在「確定」按鈕默認爲默認焦點
  3. 用戶按ENTER鍵關閉對話框,但也會導致我們的NavigationLink中的keyReleased事件觸發,立即再次打開對話框!

如何在取消ENTER事件後處理對話框中的「確定」按鈕?

回答

1

不要使用KeyListeners。

您應該使用Key Bindings將Enter鍵綁定到Action。

+0

謝謝!我不知道爲什麼KeyListeners有這個問題,Key Bindings沒有,但使用Key Bindings做了這個訣竅... – 2010-10-22 01:23:24

0

您可以嘗試通過調用getSource()來檢查keyReleased方法中的KeyEvent的來源。如果源不是NavigationLink組件,則不要調用NavigationLink.this.clickAction.run()。

+0

不幸的是,getSource()總是返回NavigationLink.this – 2010-10-22 01:03:08