最近在改进密码管理系统,
突然想到可以为它增加全局快捷键,比如:
按Ctrl+Enter,触发【refresh】按钮,按【Page Up】、【Page Down】进行翻页,按【Home】跳转到第一页;按【End】跳转到最后一页。
代码如下:
Toolkit toolkit = Toolkit.getDefaultToolkit();
// 注册应用程序全局键盘事件, 所有的键盘事件都会被此事件监听器处理.
toolkit.addAWTEventListener(
new java.awt.event.AWTEventListener() {
public void eventDispatched(AWTEvent event) {
if (event.getClass() == KeyEvent.class) {
KeyEvent kE = ((KeyEvent) event);
// 处理按键事件 Ctrl+Enter
if ((kE.getKeyCode() == KeyEvent.VK_ENTER)
&& (((InputEvent) event)
.isControlDown())) {
window.refreshAction();
} /* page down */else if (kE.getKeyCode() == KeyEvent.VK_PAGE_DOWN
&& kE.getID() == KeyEvent.KEY_PRESSED) {
window.nextPageAction();
// System.out.println("page down:"
// + kE.getID());
} /* page up */else if (kE.getKeyCode() == KeyEvent.VK_PAGE_UP
&& kE.getID() == KeyEvent.KEY_PRESSED) {
window.previousPageAction();
// System.out.println("page down:"
// + kE.getID());
}/* Ctrl +K */else if (kE.getKeyCode() == KeyEvent.VK_K
&& kE.isControlDown()
&& kE.getID() == KeyEvent.KEY_PRESSED) {
System.out.println("Ctrl +K");
window.getSearchTF().requestFocus();
}
/* home */else if (kE.getKeyCode() == KeyEvent.VK_HOME
&& kE.getID() == KeyEvent.KEY_PRESSED) {
System.out.println("home");
window.firstPageAction();
}
/* end */else if (kE.getKeyCode() == KeyEvent.VK_END
&& kE.getID() == KeyEvent.KEY_PRESSED) {
System.out.println("end");
window.lastPageAction();
}
}
}
}, java.awt.AWTEvent.KEY_EVENT_MASK);
其间遇到一个棘手的问题,就是我按【Page Down】时,触发了两次,如果当前页数为1,按一次【Page Down】,当前页数就变成了3,因为触发了两次。
为什么会这样呢?
因为键盘按下的时候触发了两种事件:KEY_PRESSED 和KEY_RELEASED
解决方法:
在if条件中增加:kE.getID() == KeyEvent.KEY_PRESSED
这样保证按一次键盘,只触发一次事件