按ESC键,退出Frame,这是一个很方便快捷的用户操作,我现在用的是一种很笨的方法,就是在每个JText、JButton等添加一个KeyListener,如果JText不多还好,如果有十几个JText、JButton,那不是每个都要添加KeyListener?太麻烦了,有没有什么好办法吗?

解决方案 »

  1.   

    // ESCTest.java
    package com.boco.test;import java.awt.KeyboardFocusManager;
    import javax.swing.JFrame;public class ESCTest extends JFrame {
    /**
     * Launch the application
     * 
     * @param args
     */
    public static void main(String args[]) {
    try {
    ESCTest frame = new ESCTest();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
     * Create the frame
     */
    public ESCTest() {
    super();
    setTitle("Press ESC TO Exit");
    setBounds(100, 100, 500, 375);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //
    KeyboardFocusManager manager = KeyboardFocusManager
    .getCurrentKeyboardFocusManager();
    manager.addKeyEventPostProcessor(new MyKeyEventPostProcessor());
    }
    }
    // MyKeyEventPostProcessor.java
    package com.boco.test;import java.awt.KeyEventPostProcessor;
    import java.awt.event.KeyEvent;public class MyKeyEventPostProcessor implements KeyEventPostProcessor {
    public boolean postProcessKeyEvent(KeyEvent event) {
    if (KeyEvent.VK_ESCAPE == event.getKeyCode()) {
    System.exit(0);
    }
    return true;
    }
    }
      

  2.   

    太麻烦了
    实现Action接口即可,将ESC与界面上的“退出”按钮联系起来
    假设“退出”按钮是cancelButtoncancelButton.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CLICK");
    cancelButton.getActionMap().put("CLICK", this);
      

  3.   

    你的必须在cancelButton得到焦点到时候才起作用的。
    我的不论何时都起作用的
      

  4.   

    用拦截器。
    拦截到了esc事件就cloes当前的frame
      

  5.   

    bovy(蓝狐狸)确实是任何焦点都可以
    zhouqi724(如花姑娘)没试过,等会儿去试试,如果要获得焦点才行,就没意思了,那100个控件,不是要100个焦点?
    另外bovy(蓝狐狸)的我改了一下:
    public void frmExitWithVK_ESC(Window frame) {
    KeyboardFocusManager manager = KeyboardFocusManager
    .getCurrentKeyboardFocusManager();
    manager.addKeyEventPostProcessor(new MyKeyEventPostProcessor(frame));
    } class MyKeyEventPostProcessor implements KeyEventPostProcessor {
    Window frame; private MyKeyEventPostProcessor(Window f) {
    frame = f;
    } public boolean postProcessKeyEvent(KeyEvent ke) {
    if (ke.getKeyCode() == KeyEvent.VK_ESCAPE)
    frame.dispose();
    return true;
    };
    }把这个方法放在一个ToolsClass里,然后
    ToolsClass tc = new ToolsClass();
    tc.frmExitWithVK_ESC(this);
    两行代码就搞定了这个复杂的操作,呵呵!