2013-03-12 45 views
3

我需要一個keylistener始終「監聽」要按下的退出鍵,然後才能退出程序。在哪裏添加KeyListener以便'始終'正在監聽

我試圖在我的主要構造打字addKeyListener(this);(一個與面板被吸入),並使用

public void keyPressed(KeyEvent e) 

{ 
     int code = e.getKeyCode(); 
     if(code == KeyEvent.VK_ESCAPE) 
     { 
      System.exit(0); 
     } 


} 

我沒有得到任何錯誤,但按下ESC鍵似乎並沒有做任何事情, 有什麼建議麼?

+0

的可能的複製http://stackoverflow.com/questions/286727/java-keylistener-for-jframe-is-being-unresponsive – 2013-03-12 12:45:25

+0

唐不使用KeyListener,而是使用KeyBindings。這將避免您描述的那類問題。 – 2013-03-12 13:08:43

回答

2
  • Top-Level Container默認從未接收KeyEventKeyListener,默認情況下,但可能有幾行代碼,錯誤的觀念,錯了聽衆

  • JPanel默認情況下將反應KeyEvent,但只有在情況這isFocusable,爲FocusOwner,錯誤的觀念,錯了聽衆,(例如),因爲你需要從JTextField移動FocusJPanel編程,錯誤的觀念

  • Swing JComponent添加KeyBindingsJFrame/JDialog/JWindow,入店默認,不爲AWT Components

+0

感謝您的幫助,我使用requestFocusInWindow()將焦點設置到面板上;並直接將keylistner分配給面板 – Mikeymca 2013-03-12 13:05:52

+0

hmmmm看清楚,簡單,[但很好的解決方法Escape Key and Dialog](http://tips4java.wordpress.com/2010/10/17/escape-key-and-dialog/)通過@camickr – mKorbel 2013-03-12 13:35:09

0

在Swing有一個頂層面板:所述玻璃面板,其允許處理在頂層事件(以避免其它小部件comsume事件)

+0

我怎麼能添加一個監聽器到GlassPane?我得到'找不到符號' – Mikeymca 2013-03-12 12:49:39

+0

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html – Gab 2013-03-12 12:51:47

+0

這有能力消耗所有的事件,這意味着沒有其他組件可以做出反應對他們來說 – MadProgrammer 2013-03-12 21:20:07

1

可以使用的InputMap/ActionMap中的機制:

Object escapeActionKey = new Object(); 
    pnl.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), escapeActionKey); 
    pnl.getActionMap().put(escapeActionKey, new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      System.err.println("escape 1"); 
     } 
    }); 

JComponent.WHEN_IN_FOCUSED_WINDOW表示當pnl組件位於聚焦窗口中時,此擊鍵可用。

或者你也可以添加一個全局AWTEventListener所監聽器:

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
     public void eventDispatched(AWTEvent event) { 
      if(event.getID() == KeyEvent.KEY_PRESSED) { 
       KeyEvent kEvent = (KeyEvent) event; 
       boolean isEsc = (kEvent.getKeyCode() == KeyEvent.VK_ESCAPE); 
       if(isEsc) { 
        System.err.println("escape 2"); 
       } 
      } 
     } 
    }, AWTEvent.KEY_EVENT_MASK); 
+0

鍵排序爲+1 – MadProgrammer 2013-03-12 21:20:30