2013-03-12 55 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