在哪里添加KeyListener以便“总是”正在收听

时间:2013-03-12 12:38:59

标签: java swing jpanel keylistener

我需要keylistener始终“监听”要按下的转义键,然后退出程序。

我尝试在我的主构造函数中输入addKeyListener(this);(绘制了面板的那个)并使用了

public void keyPressed( KeyEvent e)

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


}

我没有错误,但按下转义键似乎没有做任何事情,有什么建议吗?

3 个答案:

答案 0 :(得分:2)

    默认情况下,
  • Top-Level Container默认情况下永远不会从KeyListener接收KeyEvent,但可能会出现一些代码行,错误的想法,错误的倾听者

  • 默认
  • JPanelKeyEvent做出反应,但仅限于isFocusableFocusOwner,错误的想法,错误的倾听者(例如)因为您需要以编程方式将FocusJTextField移至JPanel,错误的想法

  • KeyBindings添加到JFrame / JDialog / JWindow,默认情况下可以Swing JComponent访问,而不是AWT Components

答案 1 :(得分: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);

答案 2 :(得分:0)

在Swing中有一个顶层面板:GlassPane允许在顶层处理事件(以避免其他小部件参与事件)