JButton (JComponents) ActionKeys zusätzlich setzen

Status
Nicht offen für weitere Antworten.

thE_29

Top Contributor
Ändern der Standard Action Keys von JComponents


Also, viele Leute hängen anstatt einen KeyListener und einem MouseListener extra, lieber einen ActionListener auf einen JButton, JCheckBox, etc.


Das ist ja an sich nichts schlechtes, nur reagiert der ActionListener eben nur auf seine ActionEvents!

Unter einem ist das die Maus und die Leertaste!


So, nun wollen aber die meisten, dass der Button auch auf Enter reagiert!



Dafür müssen wir von der entsprechenden Komponente einfach die InputMap umändern.


InputMap holen:

Java:
JButton actionButton = new JButton("Action");
InputMap inmap = actionButton.getInputMap();

Wir holen die InputMap ohne eine Condition zu sagen, dies entspricht auch dem Befehl

Code:
getInputMap(WHEN_FOCUSED);


Als nächstes die "neuen" bzw. zusätzlichen KeyStrokes generieren:

Java:
KeyStroke enterPressed = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,false);
KeyStroke enterReleased = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,true);


So, hier lassen wir uns KeyStrokes generieren.

Der erste Parameter gibt die Taste an. Hier kann man jede beliebige Taste nehmen, auch zB
Code:
KeyEvent.VK_0
, dann würde der ActionListener auch bei der Taste 0 reagieren.
Achtung! -
Code:
KeyEvent.VK_0 != KeyEvent.VK_NUMPAD0
- dh, entweder reagiert er auf die normale 0 oder auf die Numpad 0.

Der zweite Parameter gibt einen Modifier an. Also zB ob CTRL+Taste, SHIFT+Taste oder dgl.

Der dritte Parameter gibt an ob es sich um eine Released (also losgelassene Taste) oder nicht handelt.


So, nun die neuen KeyStrokes dazueintragen

Java:
inmap.put(enterPressed,"pressed");
inmap.put(enterReleased,"released");

Da es sich in Java ja immer um Referenzen zum originalen Objekt handelt, müssten wir die Map nicht mal mehr setzen, da inmap ja das gleiche Objekt ist, wie die eigentliche InputMap vom JComponent.


Trotzdem würde ich es nochmals setzen:

Java:
actionButton.setInputMap(WHEN_FOCUSED,inmap);


Hier das ganze Bsp durchgehend:

Java:
JButton actionButton = new JButton("Action");
InputMap inmap = actionButton.getInputMap(); 

KeyStroke enterPressed = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,false);
KeyStroke enterReleased = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,true);

inmap.put(enterPressed,"pressed");
inmap.put(enterReleased,"released");

actionButton.setInputMap(WHEN_FOCUSED,inmap);


So, hängt man nun einen ActionListener auf diesen JButton, so reagiert dieser auch bei Enter (oder bei der Taste die man eingestellt hat).


Funktionieren sollte das bei allen JComponents Objekten, die einen ActionListener adden können.

Ich selber habs nur bei einem JButton und einer JCheckBox getestet und da hat es geklappt.




Löschen der Standard Action Keys von JComponents


Das Löschen sieht zwar leicht aus, da die InputMap eine clearAll() Methode hat, diese funktioniert bei mir aber nicht.

Wenn ich
Code:
inmap.clearAll()
Aufrufe, habe ich trotzdem nachher noch immer gleich viele Keys (die Standard Taste, also die Leertaste) in der Map.


Daher, holen wir die map nicht via
Code:
actionButton.getInputMap()
, sondern erstellen einfach eine neue.

Hier ein Beispiel wie es funktioniert!

Zuerst eine InputMap erstellen und mit seinen Keys befühlen:

Java:
JButton actionButton = new JButton("Action");
InputMap inmap = new InputMap();

Hier ist ein Unterschied zu sehen. Wir holen diesmal die InputMap nicht vom JButton, sondern erstellen via new eine neue.

KeyStrokes erstellen und draufsetzen:

Java:
KeyStroke enterPressed = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,false);
KeyStroke enterReleased = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,true);
inmap.put(enterPressed,"pressed");
inmap.put(enterReleased,"released");

actionButton.setInputMap(WHEN_FOCUSED,inmap);

Hier ist der letzte Befehl (also das setzen der Map) sehr wichtig, da wir dieses mal ja nicht mit der InputMap vom JButton arbeiten, sondern mit einer eigenen. Würde man diesen Befehl jetzt nicht ausführen, wäre das ganze wirkungslos.

Auch hier muss man sagen, das es bei jeder JComponent funktionieren sollte.

Anbei das 2te Beispiel durchgäng:

Java:
JButton actionButton = new JButton("Action");
InputMap inmap = new InputMap();

KeyStroke enterPressed = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,false);
KeyStroke enterReleased = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,true);

inmap.put(enterPressed,"pressed");
inmap.put(enterReleased,"released");

actionButton.setInputMap(WHEN_FOCUSED,inmap);


Bei Fehlern oder dgl, bitte per PM melden, Danke!
mfg
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Oben