按ESC键退出Frame,是个快捷的操作方式,我该如何实现,要求如下:
1、当有多个Frame时,只有处于激活状态的Frame才退出,其他的都不影响
2、我用了KeyboardFocusManager这个类,捕捉键盘动作,可是捕捉的是所有键盘动作,而不是当前激活Frame的键盘动作,比如说,先加载Frm1 ,再加载Frm2,那么按ESC键时,即时Frm2 处于激活状态,也是Frm1退出,而Frm2没有反应
3、不知道是不是KeyboardFocusManager没用好,有没有其他的实现办法?
1、当有多个Frame时,只有处于激活状态的Frame才退出,其他的都不影响
2、我用了KeyboardFocusManager这个类,捕捉键盘动作,可是捕捉的是所有键盘动作,而不是当前激活Frame的键盘动作,比如说,先加载Frm1 ,再加载Frm2,那么按ESC键时,即时Frm2 处于激活状态,也是Frm1退出,而Frm2没有反应
3、不知道是不是KeyboardFocusManager没用好,有没有其他的实现办法?
用dispose可以2.把Frm2隐藏行不?
Frm2.setVisiable(false);
public void keyPressed(KeyEvent event)
{
if(event.getKeyCode()==KeyEvent.VK_ESCAPE)
......
});
这绝对OK~addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
dispose(); //退出
}
}
});
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;import javax.swing.*;
public class T {
public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().setLayout(new FlowLayout());
f.getContentPane().add(new JTextField(10));
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true); JFrame f1 = new JFrame();
f1.getContentPane().add(new JButton("Test"));
f1.setSize(300, 300);
f1.setLocationRelativeTo(null);
f1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f1.setVisible(true);
addCloseAction(f);
addCloseAction(f1);
} private static void addCloseAction(final JFrame f) {
Action disposeAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
f.dispose();
}
};
JComponent comp = f.getRootPane();
comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true), "DisposeFrame");
comp.getActionMap().put("DisposeFrame", disposeAction);
}
}