15.7 Swing Action 

Aktiviert der Nutzer eine Schaltfläche, etwa für »Ende« oder einen Eintrag im Menü, löst er damit eine Aktion aus. Das Hinzufügen der Ereignisbehandler zu den Schaltflächen ist die offensichtliche Möglichkeit. Swing bietet mit Aktionen aber eine weitere Möglichkeit, deren Sinn klar wird, wenn wir uns folgendes Szenario überlegen: Der Benutzer soll nicht nur über das Menü eine Aktion auslösen, sondern auch über die Symbolleiste. Die spontane Antwort bestünde darin, beiden Schaltflächen einfach den gleichen Ereignisbehandler zu geben. Sicherlich ist das möglich. Gehen wir aber einen Schritt weiter. Was, wenn auf Grund eines bestimmten Zustands die beiden Auslöser deaktiviert werden müssen? Und wie sieht der Aufbau aus, wenn beide beispielsweise das gleiche Icon, den gleichen Tooltip und den gleichen Text tragen? Das wäre Quellcodeduplizierung und unschön.
15.7.1 javax.swing.Action 

Swing beantwortet die Fragen mit der Schnittstelle javax.swing.Action, mit der sich Programmlogik und Zustände wie Aufschrift und Text repräsentieren lassen. In unserem Szenario müssten wir nun einmal das Action-Objekt aufbauen und dann in das Menü und die Symbolleiste hängen.
Während Action eine Schnittstelle ist, die ActionListener erweitert und zusätzliche Operationen deklariert, nutzen wir im Allgemeinen Unterklassen von AbstractAction. Bei dieser Klasse müssen wir nur noch actionPerformed() überschreiben und dort die Aktion implementieren.
Listing 15.13 com/tutego/insel/ui/swing/JButtonAction.java, Ausschnitt
Action exitAction = new AbstractAction( "Ende" ) { public void actionPerformed( ActionEvent e ) { System.exit( 0 ); } }; JButton button2 = new JButton( exitAction ); frame.add( button2 );
Ein Action-Objekt lässt sich in jedem Konstruktor einer Schaltfläche übergeben, so auch dem JButton oder JMenuItem. Sie kann alternativ über setAction(Action) mit jeder Schaltfläche verbunden werden, die AbstractButton erweitert.
15.7.2 Eigenschaften der Action-Objekte 

Die Eigenschaften einer Aktion, wie Beschriftung oder Tooltip, bestimmen Schlüssel/Werte-Paare, die putValue(String, Object) setzt. Für den Schlüssel von putValue() deklariert die Klasse bestimmte Zeichenketten über Konstanten, die mit speziellen Bedeutungen verbunden sind. Die wichtigsten sind:
Konstanten | Bedeutung |
Action.NAME |
Name der Aktion, die für die Schaltfläche oder das Menü verwendet wird |
Action.SHORT_DESCRIPTION |
Kurzbeschreibung für Tooltips |
Action.LONG_DESCRIPTION |
Längere Beschreibung, die für Hilfe verwendet werden könnte |
Action.ACCELERATOR_KEY |
Tastatur-Shortcut |
Action.MNEMONIC_KEY |
Mnemonic |
Action.SMALL_ICON |
Kleines Icon für Menüeinträge |
Action.LARGE_ICON_KEY |
Größeres Icon für Symbolleisten und Schaltflächen |
Die Icons werden nicht für JCheckBox, JToggleButton oder JRadioButton verwendet. Ist für JButton kein LARGE_ICON_KEY definiert, nimmt es ein SMALL_ICON.
Ob eine Aktion aktiviert ist, bestimmt setEnabled(boolean) und erfragt isEnabled(). Während putValue(String,Object) den Wert setzt, erfragt ihn getValue(String).
Listing 15.14 JButtonAction2.java, ExitAction class ExitAction extends AbstractAction { { putValue( Action.NAME, "Beenden" ); putValue( Action.DISPLAYED_MNEMONIC_INDEX_KEY, 0 ); } public void actionPerformed( ActionEvent e ) { System.exit( 0 ); } } |
Indem wir DISPLAYED_MNEMONIC_INDEX_KEY auf 0 setzen, erreichen wir, dass vom String »Beenden« das »B« unterstrichen und ein Tastenkürzel wird. Ein größeres Beispiel mit Aktionen bietet das Unterkapitel für Menüs zusammen mit Symbolleisten.