swing 全局键盘监听事件

[code="java"]

final JFrame j = new JFrame();
j.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
System.out.println("this evt:"+evt.getKeyChar());
}
});
[/code]
貌似打印不出我想要的值,求大大们指点~

全局键盘监听事件需要注册的吧
[code="java"]

class ImplAWTEventListener implements AWTEventListener {
@Override
public void eventDispatched(AWTEvent event) {
if (event.getClass() == KeyEvent.class) {
// 被处理的事件是键盘事件.
KeyEvent keyEvent = (KeyEvent) event;
if (keyEvent.getID() == KeyEvent.KEY_PRESSED) {
//按下时你要做的事情
keyPressed(keyEvent);
} else if (keyEvent.getID() == KeyEvent.KEY_RELEASED) {
//放开时你要做的事情
keyReleased(keyEvent);
}
}
}
private void mousePressed(MouseEvent event) {}
private void keyReleased(KeyEvent event) {}
}
[/code]

你的窗口类中可以这样添加,可以在初始化UI组件方法中或写在构造函数中
[code="java"]
Toolkit tk = Toolkit.getDefaultToolkit();
tk.addAWTEventListener(new ImplAWTEventListener(), AWTEvent.KEY_EVENT_MASK);
[/code]

用你上面的方法确实不能达到效果.你试试下面两种方法,之前写的.
1. Toolkit.getDefaultToolkit().addAWTEventListener(listener,eventMask);
这个方法注册全局的监听机制,无论哪个窗口。里面注册为weakHashmap,应该不用考虑垃圾回收问题。因为是全局的,不建议采用。
2. 拦截每个component自己的事件。
正常来说,如果在textbox里面打字,事件不会交给window处理。enableInputMethods(true)可以帮忙。
enable以后调用getInputContext(),取得InputContext处理。
注意,InputContext的dispatchEvent(AWTEvent)会接到各种消息,感兴趣的getID()有以下三个:
MouseEvent.MOUSE_CLICKED
MouseEvent.MOUSE_WHEEL
KeyEvent.KEY_TYPED

C#开源的键盘监听器:http://www.haonanji.cn/214.html。

C#开源的键盘监听器:http://www.haonanji.cn/214.html。