写了一个键盘监听类:
class myKeyListener implements KeyListener{}
用来为一个窗口JFrame加入键盘监听:
但是,KeyListener()只能捕获当前键盘焦点所在的控件Fire出来的事件。
现在这个Frame里有几个Panel,每个Panel里面很多的控件。所以单独为每个焦点可能达到的控件添加键盘监听是不实际的。
但是如果面板里有可以获得焦点的控件,如button,为面板添加的键盘监听就没有效果,只响应Tab或者shift Tab来移动焦点。
但是我希望不管当前焦点在哪里,我按下F1~F12都要能够捕获到键盘事件然后响应。
各位,应该有比较简单的办法吧?
谢谢啦!

解决方案 »

  1.   

    static {
            try {
                Toolkit toolkit = Toolkit.getDefaultToolkit();
                toolkit.addAWTEventListener(new AWTEventListener() {
                    public void eventDispatched(AWTEvent e) {
                        if (((KeyEvent) e).getKeyCode() == KeyEvent.VK_F1)
                            System.out.println("F1");
                        if (((KeyEvent) e).getKeyCode() == KeyEvent.VK_F2)
                            System.out.println("F2");
                    }
                }, AWTEvent.KEY_EVENT_MASK);
                Thread thread = new Thread(new Runnable() {
                    public void run() {
                        try {
                            File music = new File(iSystemConstants.muiscfile);
                            Player player = new Player(new FileInputStream(music));
                            player.play();
                        } catch (FileNotFoundException ex) {
                        } catch (JavaLayerException ex) {
                        }                }
                });
                //thread.start();            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR",
                                              JOptionPane.ERROR_MESSAGE);
            }
        }
      

  2.   

    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR",
                                              JOptionPane.ERROR_MESSAGE);
            }
      

  3.   

    问题问得好,参考下载的例子:
    如何通过按ESC键,退出本Frame? 
    http://blog.csdn.net/bovy/archive/2007/04/04/1552003.aspx
      

  4.   

    bovy(蓝狐狸) 的方法不错!
    不过看这个:
    public class MyKeyEventPostProcessor implements KeyEventPostProcessor {
    public boolean postProcessKeyEvent(KeyEvent event) {// why must be public? if (KeyEvent.VK_ESCAPE == event.getKeyCode()) {
    System.exit(0);
    } if (KeyEvent.VK_F1 == event.getKeyCode()) {
    System.out.println("F1 be pressed!");
    }
    return true;
    }
    }
    为什么System.out.println("F1 be pressed!");执行了两次?
    貌似按键按下和松开各fire了一个KeyEvent。而且按住不放的时候会不断的执行!
    但是我只要他能响应按下事件就可以了,按住不放以及松开都不处理。(如果按住不放不断处理的话很恐怖,假设按F1是做一个数据库查询显示操作,那就恐怖啦。)
    要如何做?
      

  5.   

    public void keyPressed(event) {
    // TODO Auto-generated method stub
    if (KeyEvent.VK_F1 == event.getKeyCode()) {
    System.out.println("F1 be pressed!");
    }

    } public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

    } public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

    }
    就是想KeyListener这样做,可以只对一次按下事件响应,其余忽略。
      

  6.   

    if (KeyEvent.VK_F2 == event.getKeyCode()) {
    if(KeyEvent.KEY_PRESSED==event.getID()){
    System.out.println("F2 be pressed!");
    return true;
    }
    }
    原来event的getID方法返回的就是键盘事件类型啊,真笨。
    谢谢各位啦,结贴咯!