最近在改进密码管理系统,
突然想到可以为它增加全局快捷键,比如:
按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
这样保证按一次键盘,只触发一次事件