Der klassische Weg eine Komponente und eine Tastenkobination zu verbinden führt über die Key– und ActionMap.
[code lang=“java“]Action doNothing = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println(„F2“);
}
};
jPanel.getInputMap().put(
KeyStroke.getKeyStroke(„F2“), „doActionF2“);
jPanel.getActionMap().put(„doActionF2“,
doNothing);[/code]
Jede Komponente kennt drei InputMap, um nut bei bestimmten Fokuszuständen reagieren zu müssen.
Möchte man eine Tastenkombination für die gesamte Anwendnung zur Verfügung stellen, muss man den KeyboardFocusManager nutzen.
[code lang=“java“]KeyEventDispatcher disp = new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_F2 &&
evt.getId() == KeyEvent.KEY_RELEASED){
System.out.println(„F2“);
}
return true;
}
};
KeyboardFocusManager.getCurrentKeyboardFocusManager().
addKeyEventDispatcher(disp);[/code]
Weitere Informationen unter:
http://java.sun.com/products/jlf/ed2/book/
http://java.sun.com/docs/books/tutorial/
http://javamagazin.de/itr/online_artikel/
IMO reicht in den meisten Fällen, getInputMap() durch
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).
Das funktioniert aber immer nur für das Fenster, das die Komponente enthält, von der die Inputmap stammt. Sollte man z.B. Dialogfenster in der Anwendung haben, auf die die selbe Behandlung erfolgen soll, dann könnte die Lösung mit dem KeyEventDispatcher besser sein (sonst müsste man die gleiche Action auf allen Unterdialogen registieren -> das stinkt ;-))
Ich habe Deine Lösung gerade in nem größeren Projekt ausprobiert (aus Neugier, brauchen tu ich sie nicht) und habe festgestellt, dass alle anderen Tastenkombinationen nicht mehr funktionierten, selbst die Navigation im JTree war betroffen…
Daher eine kleine Anpassung:
[code]
KeyEventDispatcher disp = new DefaultKeyboardFocusManager() {
public boolean dispatchKeyEvent(KeyEvent evt) {
super.dispatchKeyEvent(evt);
if(
evt.getKeyCode() == KeyEvent.VK_F2
&& evt.getID() == KeyEvent.KEY_RELEASED){
System.out.println(„F2“);
}
return true;
}
};
[/code]