我正在尝试在单击按钮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;
}
}
答案 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));
你为什么这么问?因为您可以在Action
和JMenuItem
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循环。