Для людей интересно (как я), как использовать 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;
}
});
}
Использование SwingUtils.invokeLater(), может быть, не нужно, но это, вероятно, хорошая идея, чтобы не блокировать глобальный цикл событий.
+1 Лучший, самый простой ответ, который я нашел. Я продолжу это x1000 – 2011-10-26 16:05:05
x1001 будет лучше, таким образом, он, по крайней мере, получит преимущество. – Epaga 2012-04-17 09:46:16
@Epaga Или 999 раз – 2013-09-01 15:50:58