Java 在何处添加KeyListener以';始终';在听

Java 在何处添加KeyListener以';始终';在听,java,swing,jpanel,keylistener,Java,Swing,Jpanel,Keylistener,我需要一个keysister始终“监听”要按下的退出键,然后退出程序 我试过输入addKeyListener(这个)在我的主构造函数中(绘制面板的构造函数),并已使用 public void keyPressed( KeyEvent e) { int code = e.getKeyCode(); if(code == KeyEvent.VK_ESCAPE) { System.exit( 0 ); } } 我没有收到任何

我需要一个
keysister
始终“监听”要按下的退出键,然后退出程序

我试过输入
addKeyListener(这个)在我的主构造函数中(绘制面板的构造函数),并已使用

public void keyPressed( KeyEvent e)

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


}
我没有收到任何错误,但按escape键似乎没有任何作用,有什么建议吗?

  • 默认情况下,从不接收来自的
    KeyEvent
    ,但可能有几行代码、错误的想法、错误的侦听器

  • 通过对
    KeyEvent
    进行诽谤性反应,但仅在
    可聚焦的情况下,才是
    聚焦所有者
    ,错误的想法,错误的听众(例如),因为您需要以编程方式将
    聚焦
    JTextField
    移动到
    JPanel
    ,这是错误的想法

  • 添加到
    JFrame
    /
    JDialog
    /
    JWindow
    ,默认情况下可用于
    Swing JComponent
    ,而不用于
    AWT组件


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

您可以使用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);

可能的重复项不使用KeyListener,而是使用KeyBinding。这将避免您所描述的问题。如何将侦听器添加到GlassPane?我得到了“找不到符号”这有能力消耗所有事件,这意味着其他组件都不能对它们做出反应感谢您的帮助,我使用requestFocusInWindow()将焦点设置到面板上;并将keylistner直接分配给面板HMMMM请参见@camickr提供的clear,simple