10.7Schaltflächen
Eine Schaltfläche (engl. button) ermöglicht es dem Anwender, eine Aktion auszulösen. Schaltflächen sind meistens beschriftet und stellen eine Zeichenkette dar oder tragen eine Grafik, etwa im Fall eines Symbols in der Symbolleiste. Unter dem AWT kann eine Schaltfläche nur Text, aber keine Icons darstellen.
Swing kennt unterschiedliche Schaltflächen. Dazu zählen JButton für einfache Schaltflächen, aber auch Schaltflächen zum Ankreuzen.
10.7.1Normale Schaltflächen (JButton)
Die Schaltfläche JButton reagiert auf Aktivierung und erzeugt ein ActionEvent, das ein angehängter ActionListener meldet.
Abbildung 10.24JButton mit einer einfachen Schaltfläche zum Schließen
Listing 10.13com/tutego/insel/ui/swing/JButtonDemo.java, main()
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLayout( new FlowLayout() );
// Button 1
final Icon icon1 = new ImageIcon(
JButtonDemo.class.getResource( "/images/user-trash-full.png" ) );
final Icon icon2 = new ImageIcon(
JButtonDemo.class.getResource( "/images/user-trash.png" ) );
final JButton button1 = new JButton( icon1 );
frame.add( button1 );
ActionListener al = new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
button1.setIcon( icon2 );
}
};
button1.addActionListener( al );
// Button 2
final JButton button2 = new JButton( "Ende" );
frame.add( button2 );
button2.addActionListener( new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
System.exit( 0 );
}
} );
frame.pack();
frame.setVisible( true );
Die JButton-API
Es gibt mehrere Konstruktoren für JButton-Objekte. Die parameterlose Variante erzeugt eine Schaltfläche ohne Text. Der Text lässt sich mit setText(String) nachträglich ändern. In der Regel nutzen wir den Konstruktor, dem ein String mitgegeben wird.
extends AbstractButton
implements Accessible
JButton()
Erzeugt eine neue Schaltfläche ohne Aufschrift.JButton(String text)
Erzeugt eine neue Schaltfläche mit Aufschrift.JButton(Icon icon)
Erzeugt eine neue Schaltfläche mit Icon.JButton(String text, Icon icon)
Erzeugt eine neue Schaltfläche mit Aufschrift und Icon.void setText(String text)
Ändert die Aufschrift der Schaltfläche auch im laufenden Betrieb.[ 97 ](Vergleichen wir das mit den Methoden der Klasse java.awt.Label. Hier heißen die Methoden zum Lesen und Ändern des Textes setLabel() und getLabel(). Dies ist für mich wieder eines der AWT-Rätsel. Warum heißt es bei einem java.awt.Label-Objekt setText()/getText() und bei einem java.awt.Button-Objekt setLabel()/getLabel()? Immerhin heißt es bei den Swing-Komponenten JLabel und JButton konsequent setText()/getText().)String getText()
Liefert die Aufschrift der Schaltfläche.void addActionListener(ActionListener l)
Fügt dem Button einen ActionListener hinzu, der die Ereignisse abgreift, die durch die Schaltfläche ausgelöst werden.void removeActionListener(ActionListener l)
Entfernt den ActionListener wieder. Somit kann er keine weiteren Ereignisse mehr abgreifen.
[»]Hinweis
Wörter mit einer starken emotionalen Bindung sollten vermieden werden. In englischen Programmen müssen Wörter wie »kill« oder »abort« umgangen werden.[ 98 ](Siehe dazu das Buch »Tog on Interface« von Bruce Tognazzini, auszugsweise unter http://www.asktog.com/TOI/toi06KeyboardVMouse1.html.)
10.7.2Der aufmerksame ActionListener
Klicken wir auf die Schaltfläche, so sollte die Aktion gemeldet werden. Diese wird in Form eines ActionEvent-Objekts an den Zuhörer (einen ActionListener) gesendet. Ein ActionListener wird mit der Methode addActionListener(ActionListener) an die Objekte angeheftet, die Aktionen auslösen können. ActionListener ist eine Schnittstelle mit der Methode actionPerformed(…). Die Schnittstelle ActionListener wiederum erweitert die Schnittstelle EventListener, die von allen Listener-Interfaces implementiert werden muss.
extends EventListener
void actionPerformed(ActionEvent e)
Wird aufgerufen, wenn eine Aktion ausgelöst wird.
Abbildung 10.25Die Beziehung zwischen ActionListener und ActionEvent
Werfen wir noch einmal einen Blick auf die Implementierung unserer beiden ActionListener-Klassen, die als anonyme innere Klasse realisiert sind:
@Override public void actionPerformed( ActionEvent e ) {
button1.setIcon( icon2 );
}
};
button2.addActionListener( new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
System.exit( 0 );
}
} );
10.7.3Schaltflächen-Ereignisse vom Typ ActionEvent
Registriert die Schaltfläche einen Klick, wird ein ActionEvent erzeugt und auf allen angemeldeten Listenern die Methode actionPerformed(ActionEvent) aufgerufen.
extends AWTEvent
int getModifiers()
Liefert den Umschaltcode für Tasten, die während des Ereignisses gedrückt waren, als Verknüpfung der Konstanten SHIFT_MASK, CTRL_MASK, META_MASK (etwa die (Alt)-, (š)- oder (œ)-Taste) und ALT_MASK. Diese Konstanten kommen direkt aus der Event-Klasse, so ist etwa ALT_MASK = Event.ALT_MASK. Außerdem gibt es die Konstanten ACTION_FIRST, ACTION_LAST und ACTION_PERFORMED, die aber alle für den gleichen Wert stehen.long getWhen()
Liefert einen Zeitstempel, wann das Ereignis ausgelöst wurde.String paramString()
Liefert einen Erkennungs-String für das Ereignis.
10.7.4Basisklasse AbstractButton
Alle Schaltflächen haben in Java eine gemeinsame Oberklasse, die Eigenschaften wie Listener, Abstand Text/Icon und Weiteres bestimmt. Diese Oberklasse ist AbstractButton und ist Basis von:
Der AbstractButton ist, wie der Name schon sagt, eine abstrakte Klasse, die aus JComponent hervorgeht. Über die Oberklasse lassen sich die folgenden Eigenschaften für alle Schaltflächen steuern:
Das Mnemonik-Zeichen – ein Kürzel, das im Text unterstrichen dargestellt wird und schnell über die (Alt)-Taste aufgerufen werden kann. Dies übernimmt die Methode setMnemonic(char).
Sich selbst auslösen durch doClick().
Icons mit setDisabledIcon(Icon), setDisabledSelectedIcon(Icon), setPressedIcon(Icon), setRolloverIcon(Icon), setRolloverSelectedIcon(Icon) und setSelectedIcon(Icon) ändern.
Die Ausrichtung von Text und Icon in der Schaltfläche durch setVerticalAlignment(…) und setHorizontalAlignment(…) bestimmen.
Die Position von Icon und Text untereinander durch setVerticalTextPosition(…) und setHorizontalTextPosition(…) bestimmen.
Abbildung 10.26Die Klasse AbstractButton und ihre Unterklassen
Den Erkennungs-String (Action-Command) einer Schaltfläche ändern *
Manche Ereignisbehandler für Schaltflächen sind einander so ähnlich, dass Entwickler nur einen Listener mit mehreren Schaltflächen verbinden möchten. Dann taucht nur das Problem auf, wie der Listener die Schaltflächen unterscheiden soll. Eine Idee wäre, die Beschriftung mit getText() auszulesen – was allerdings ein Problem mit sich bringt, wenn die Software stark landessprachlich ist, da sich bei mehrsprachigen Anwendungen die Aufschrift ändert. Eine andere Lösung bestünde darin, mit getSource() zu arbeiten. Dann müsste im Listener allerdings die Komponente für einen Vergleich verfügbar sein (was oft nicht der Fall ist).
Als Lösung bietet die AbstractButton-Klasse die Methode setActionCommand(String) an, mit der sich eine Kennung, der so genannte Action-Command, setzen lässt:
extends JComponent
implements ItemSelectable, SwingConstants
void setActionCommand(String command)
Setzt einen neuen Kommando-String, wenn das Ereignis ausgeführt wird.
Der Listener kann diesen Action-Command mit getActionCommand() aus dem ActionEvent auslesen.
extends AWTEvent
String getActionCommand()
Liefert den String, der mit dieser Aktion verbunden ist.
Ohne explizites Setzen ist der Action-Command standardmäßig mit der Beschriftung der Schaltfläche initialisiert.
10.7.5Wechselknopf (JToggleButton)
Ein JToggleButton (zu Deutsch Wechselknopf) hat im Gegensatz zum JButton zwei Zustände. Dies ist vergleichbar mit einem Schalter, der den Zustand »ein« oder »aus« annimmt. Der JButton gerät in diesen Zustand nur bei der Aktivierung, springt dann aber wieder in seinen ursprünglichen Zustand zurück. Der JToggleButton springt bei der ersten Aktivierung in einen festen Zustand und bleibt dort so lange, bis er wieder aktiviert wird. JToggleButton ist die Oberklasse für die Auswahlknöpfe JCheckBox und JRadioButton.