当我按Escape键时,JFrame没有处理

yj2*_*000 1 java swing keylistener

我试图使程序在单击按钮ESC时响应,以便它可以处理jframe。我不确定是什么问题,但似乎在主菜单的if语句中。

*注意:te是类的对象名称(文本编辑器)

这部分是主要方法

f.add(text);
    f.addKeyListener(te);
    f.setVisible(true);

    while(true){
       if (exiting == true){
           f.dispose();
       }

    }
Run Code Online (Sandbox Code Playgroud)

这部分超出主要方法

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ESCAPE){
        exiting = true;

    }
}
Run Code Online (Sandbox Code Playgroud)

Mad*_*mer 5

KeyListener通常不要使用s,它们所连接的组件必须具有键盘焦点才能被触发。

而是使用按键绑定...

InputMap im = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getRootPane().getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
am.put("cancel", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        dispose();
    }
});
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见如何使用键绑定

由于ActionAPI 的强大功能,我将创建一个基本的“ dispose”操作以以下内容开始:

public class DisposeWindowAction extends AbstractAction {

    private Window window;

    public DisposeWindowAction(Window window) {
        this.window = window;
        putValue(NAME, "Dispose");
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, 0));
    }

    public Window getWindow() {
        return window;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        getWindow().dispose();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,我将其绑定到ActionMap...

am.put("cancel", new DisposeWindowAction(this));
Run Code Online (Sandbox Code Playgroud)

你为什么问?因为您然后可以ActionJMenuItems和s中使用相同的JButton内容...。

JButton disposeButton = new JButton(new DisposeWindowAction(this));
...
Run Code Online (Sandbox Code Playgroud)

(您可以使用的相同实例Action,但您会明白这一点),现在用户可以使用三种类似的方式来处理窗口...

有关更多详细信息,请参见如何使用动作