लोग (मेरे जैसे) KeyEventDispatcher उपयोग करने के लिए कैसे सोच के लिए, यहाँ एक उदाहरण है कि मैं एक साथ रखा है। यह सभी वैश्विक कार्यों को संग्रहीत करने के लिए हैश मैप का उपयोग करता है, क्योंकि मुझे बड़ी 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 के उपयोग() हो सकता है आवश्यक नहीं है, लेकिन यह शायद वैश्विक घटना पाश ब्लॉक करने के लिए नहीं एक अच्छा विचार है।
स्रोत
2011-12-13 07:52:07
+1 सबसे अच्छा, सबसे आसान जवाब मैं मिल गया है। मैं इस x1000 –
x1001 को बेहतर बनाउंगा, इस तरह वह कम से कम एक अपवर्तित होगा। – Epaga
@Epaga या 999 बार –