KeyBindung an einen JButton
-
Hallo Leute,
ich habe versucht, nach Beispielen als Vorlage ein Keybindung zu bauen. Leider funktioniert es nicht. Vielleicht könnt ihr mir helfen, es zum Laufen zu bringen. Im wesentlichen sieht es so aus:
private void myFunction() { //... myKeyAction= new AbstractAction(){ @Override public void actionPerformed(ActionEvent arg0) { someVariable += 0.7; } }; this.btnAnyButton.getInputMap ().put(KeyStroke.getKeyStroke("VK_RIGHT"), "schneller"); this.btnAnyButton.getActionMap ().put("schneller", myKeyAction); } // Memberdeklaration entsprechend: private Action myKeyAction;
Eigentlich sollte es ganz einfach gehen. Wenn ich es richtig verstehe, sollte die Pfeiltaste ("VK_RIGHT") den Event aktivieren, egal wo der Fokus ist.
Dazu auch drei Verständnisfragen:-
Eigentlich ist es (in meinem Fall) egal, an welches Component der event gebunden wird. Mit dem Rootlabel (JLabel) habe ich es auch probiert, zeigt auch keine Reaktion. Mit JFrame kann man es offenbar gar nicht registrieren.
-
Die Tags
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
(und die 2 anderen) sind offenbar veraltet und man muss sie nicht mehr angeben? -
An welcher Stelle im Programm muss das Keybindung registriert werden? Momentan ist es in der Setuproutine für die Gui, die bei Programmstart aufgerufen wird. Hat es etwas damit zu tun?
Danke im voraus für eure Hilfe, von einem blutjungen Java-Einsteiger.
mfg
tobi
-
-
Die Dokumentation sollte deine Fragen eigentlich beantworten:
public final InputMap getInputMap()
**Returns the InputMap that is used when the component has focus. This is convenience method for getInputMap(WHEN_FOCUSED)
**
-
Danke für den Hinweis. Ich hatte vorher schon die Dokumentationen durchgelesen, jetzt nochmal, habe verschiedene andere Möglichkeiten probiert, und bin immer noch nicht drauf gekommen, warum es nicht geht, bzw. wie es gehen sollte... vielleicht kann mir ja noch jemand anderes helfen.
Danke.edit: und mein Fehler oben: eine Verwechslung. Nicht die conditions sind veraltet sondern
registerKeyboardAction
, aber das zu wissen bringt mich leider auch nicht weiter.
-
So, ich hab den Fehler gefunden:
getKeyStroke
kann als Argument zwar auch Strings annehmen, aber das gilt nicht für die KeyEvent-Konstanten sondern nur für den direkten Buchstaben. Man kann also z.B. schreibengetKeyStroke("A")
und die Action wird ausgelöst. Will man aber andere Tasten benutzen, z.B. Modifizierer oder Pfeiltasten wie in meinem Beispiel, muss man eine andere Überladung von
getKeyStroke
benutzen, nämlich:
`KeyCode.getKeyStroke(int keyCode, int modifiers)`
Es sieht dann z.B. so aus:put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "bezeichner");
und der Tastaturevent kann richtig gemapt werden.
Naja, und das andere, die Kondition bei
getInputMap (JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
oder Zweckentsprechendes, muss natürlich auch entsprechend angeben werden. (s. Gast-Hinweis)
Im Endeffekt also ganz einfach.