对于那些想知道如何使用KeyEventDispatcher的人(像我一样),这里是我整理的一个例子。它使用HashMap来存储所有全局操作,因为我不喜欢大的if (key == ..) then .. else if (key == ..) then .. else if (key ==..) ..结构。
/** map containing all global actions */
private HashMap<KeyStroke, Action> actionMap = new HashMap<KeyStroke, Action>();
/** call this somewhere in your GUI construction */
private void setup() {
KeyStroke key1 = KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK);
actionMap.put(key1, new AbstractAction("action1") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Ctrl-A pressed: " + e);
}
});
// add more actions..
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
kfm.addKeyEventDispatcher( new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e);
if ( actionMap.containsKey(keyStroke) ) {
final Action a = actionMap.get(keyStroke);
final ActionEvent ae = new ActionEvent(e.getSource(), e.getID(), null );
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
a.actionPerformed(ae);
}
} );
return true;
}
return false;
}
});
}
6条答案
按热度按时间mlnl4t2r1#
对于每个窗口,使用条件为
WHEN_IN_FOCUSED_WINDOW
的JComponent.registerKeyboardAction
。或者用途:如API文档中所述。
blpfk2vs2#
安装自定义KeyEventDispatcher。KeyboardFocusManager类也是实现此功能的好地方。
KeyEventDispatcher
58wvjzkj3#
对于那些想知道如何使用KeyEventDispatcher的人(像我一样),这里是我整理的一个例子。它使用HashMap来存储所有全局操作,因为我不喜欢大的
if (key == ..) then .. else if (key == ..) then .. else if (key ==..) ..
结构。也许没有必要使用SwingUtils.invokeLater(),但最好不要阻塞全局事件循环。
2nbm6dog4#
如果有菜单,则可以向菜单项添加全局键盘快捷键:
rbpvctlc5#
一个简单的例子:
ql3eal8s6#
使用以下代码段
将“ctrl D”替换为所需的快捷键。