当我按下逃生时JFrame不处理

时间:2015-07-10 21:42:49

标签: java swing keylistener

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

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

这部分是主要方法

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

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

    }

这部分不在主要方法

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

    }
}

2 个答案:

答案 0 :(得分:5)

不要使用KeyListener,作为一般规则,它们所连接的组件必须具有关键板焦点才能被触发。

相反,请使用键绑定...

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();
    }
});

有关详细信息,请参阅How to Use Key Bindings

由于Action API的强大功能,我会创建一个基本的“处置”操作,以便开始:

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();
    }

}

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

am.put("cancel", new DisposeWindowAction(this));

你为什么这么问?因为您可以在ActionJMenuItem s中使用相同的JButton ....

JButton disposeButton = new JButton(new DisposeWindowAction(this));
...

(你可以使用Action的相同实例,但是你明白了)现在用户有三种方法来处理窗口......

有关详细信息,请参阅How to Use Actions

答案 1 :(得分:1)

有一种更简单的方法可以将监听器添加到jframe中。您所要做的就是创建一个重写按键的keylistener,然后检查e.getComponent()的对象类型。如果是窗口类型,则可以在按下退出键时调用dispose。

public void keyPressed(KeyEvent e){
    If(e.getKeyCode() == KeyEvent.VK_ESCAPE){
        If( e.getComponent() instanceof Window){
            ((Window)e.getComponent()).dispose();
        }
    }
}

您当然可以将窗口更改为JFrame,并将两个if语句放在一起。

此外,您不需要while循环。