3

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

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

public void keyPressed( KeyEvent e)

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


}

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

4

3 回答 3

2
  • Top-Level Container默认情况下从不接收KeyEventKeyListener默认情况下,但可能有几行代码,错误的想法,错误的侦听器

  • JPanel默认情况下对 做出反应,KeyEvent但仅在错误的想法、错误的听众(例如)因为您需要以编程方式从错误的想法转变为错误的想法的情况下isFocusableFocusOwnerFocusJTextFieldJPanel

  • 添加KeyBindingsJFrame// JDialogJWindow默认情况下可以访问 for Swing JComponent,而不是 forAWT Components

于 2013-03-12T12:44:17.523 回答
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);
于 2013-03-12T13:15:10.677 回答
0

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

于 2013-03-12T12:45:43.713 回答