日期:2014-05-20  浏览次数:20781 次

如何在单个窗口的范围内监听所有键盘事件
我用下面的代码实现了无论焦点在哪个组件上窗口都能监听键盘事件.
Java code
public focustest() {//构造方法  
    ...............  
    Toolkit tk = Toolkit.getDefaultToolkit();  
     tk.addAWTEventListener(new GlobalEventListener(),AWTEvent.KEY_EVENT_MASK);  
}  
   
 class GlobalEventListener implements AWTEventListener {//子类  
     public void eventDispatched(AWTEvent evt) {  
         if (evt instanceof KeyEvent) {  
             KeyEvent kevt = (KeyEvent) evt;  
             if (kevt.getID() == KeyEvent.KEY_PRESSED) {  
                 String modifier = KeyEvent.getKeyModifiersText(kevt.getModifiers());  
                 String key = KeyEvent.getKeyText(kevt.getKeyCode());  
                 System.out.println("Modifier:"+modifier+"|Key:"+key);  
             }  
         }  
     }  
} 
 

但是这样做是全局的,快捷键似乎在任何情况下都能响应.比如我定义"Ctrl + a"弹出子窗口a,"Ctrl + b"弹出子窗口b.运行的时候如果已经弹出窗口a(获得焦点的已经是窗口a了),按"Ctrl + b"还是能弹出窗口b.

我想要做到的是,当窗口a出现后"Ctrl + b"不会使窗口b弹出.而当窗口a关闭.焦点回到原窗口后"Ctrl + b"才能弹出窗口b.请问有没有办法做到这一点?

------解决方案--------------------
加一个WindowFocusListener