按ESC键退出Frame,是个快捷的操作方式,我该如何实现,要求如下:
1、当有多个Frame时,只有处于激活状态的Frame才退出,其他的都不影响
2、我用了KeyboardFocusManager这个类,捕捉键盘动作,可是捕捉的是所有键盘动作,而不是当前激活Frame的键盘动作,比如说,先加载Frm1 ,再加载Frm2,那么按ESC键时,即时Frm2 处于激活状态,也是Frm1退出,而Frm2没有反应
3、不知道是不是KeyboardFocusManager没用好,有没有其他的实现办法?

解决方案 »

  1.   

    1.Frm2.dispose
    用dispose可以2.把Frm2隐藏行不?
    Frm2.setVisiable(false);
      

  2.   

    addKeyListener(new KeyAdapter(){
       public void keyPressed(KeyEvent event)
       {
          if(event.getKeyCode()==KeyEvent.VK_ESCAPE)
           ......
    });
      

  3.   

    楼上好像不对~~
    这绝对OK~addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
                    dispose();   //退出
                    }
                }
            });
      

  4.   

    加addKeyListener的方法早想过了,必须是frm上没有任何控件才行,如果frm上有txtfield,焦点就在txtfield上,frm的KeyListener是无法生效的
      

  5.   

    import java.awt.FlowLayout;
    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);
    }
    }