15.14 Eines aus vielen – Kontrollfelder (JCheckBox)
 
Ein Kontrollfeld ist eine Komponente mit einem Zustand: »Ein« oder »Aus«. Der Zustand wird meistens als Rechteck oder Kreis neben einer Zeichenkette dargestellt. Kontrollfelder dienen dem Benutzer meistens als Auswahl von Optionen. Bei einer Pizza-Bestellung kann etwa ein Optionsfeld die Beläge anbieten. Hier würde ich dann immer Pilze, Paprika und Zwiebeln wählen.
Unter dem AWT heißt die Komponente für das Kontrollfeld Checkbox. Der JCheckBox unter Swing lassen sich gegenüber der Checkbox aus dem AWT verschiedene Grafiken für den eingeschalteten und ausgeschalteten Zustand zuweisen. Dazu dienen die Methoden setIcon() und setSelectedIcon(). Diese Methoden kommen alle aus der Oberklasse AbstractButton. Im Konstruktor lässt sich als zweites Argument ein Wahrheitswert angeben, der bestimmt, ob das Feld am Anfang gesetzt ist oder nicht.
Ändert sich der Zustand eines Felds (Selektion oder Deselektion), dann wird ein ItemEvent an alle registrierten ItemListener weitergeleitet. Nach dem Anlegen des Objekts kann die Methode setState(boolean) den Status verändern. Das Argument true markiert die Option des Kontrollfelds. getState() liefert den aktuellen Status des Kontrollfelds.
Listing 15.21
JCheckBoxDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JCheckBoxDemo
{
public static void main( String args[] )
{
JFrame frame = new JFrame( "Tolle Fernsehserien" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
Icon unchecked = new ImageIcon( ImageIconDemo.class.getResource(
"not.gif" ) );
Icon checked = new ImageIcon( ImageIconDemo.class.getResource( "ok.gif" ) );
JCheckBox cb1 = new JCheckBox( "Ein Colt für alle Fälle", true );
cb1.setIcon( unchecked );
cb1.setSelectedIcon( checked );
frame.getContentPane().add( cb1, BorderLayout.NORTH );
JCheckBox cb2 = new JCheckBox( "MacGyver", false );
cb2.setIcon( unchecked );
cb2.setSelectedIcon( checked );
frame.getContentPane().add( cb2, BorderLayout.SOUTH );
// Listener für die Helden
ItemListener heldenListener = new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
System.out.println( e );
}
};
cb1.addItemListener( heldenListener );
cb2.addItemListener( heldenListener );
frame.pack();
frame.setVisible( true );
}
}
 Hier klicken, um das Bild zu Vergrößern
Abbildung 15.14
Kontrollkästchen für unsere Helden
15.14.1 Ereignisse über ItemListener
 
Ein Checkbox-Objekt löst genau dann ein ItemEvent aus, wenn das Kontrollfeld ein- oder ausgeschaltet wird. Mittels addItemListener() wird ein ItemListener registriert, der bei einer Zustandsänderung über die itemStateChanged(ItemEvent)-Methode benachrichtigt wird.
Innerhalb der Funktion itemStateChanged() bezieht wie üblich getSource() den Auslöser des Ereignisses. Es gibt aber noch einen zweiten Weg über die Methode getItemSelectable(), die den Auslöser als ItemSelectable liefert; diese Schnittstelle wird zum Beispiel JCheckBox, aber auch von anderen implementiert. Ob nun eine Selektion oder Deselektion stattfand beziehungsweise wie der aktuelle Zustand ist, lässt sich auch wiederum über unterschiedliche Wege erfragen. Mittels der Objektmethoden getStateChange() von ItemEvent lässt sich der Wechsel (Selektion oder Deselektion) erfragen. Der Rückgabewert ist eine Ganzzahl, und wir sollten ihn mit den Konstanten ItemEvent.SELECTED und ItemEvent.DESELECTED vergleichen. Der andere Weg geht über die Komponente selbst: Im Fall einer JCheckBox – und jeder allgemeinen Schaltflächen-Art, die Unterklasse von AbstractButton ist – ermittelt isSelected() den aktuellen Zustand.
Beispiel Die Implementierung einer Ereignisbehandlung zeigt, wie wir den Text des Kontrollfelds und den Zustand einfach ausgeben können. Hier muss eine Klasse die Schnittstelle ItemListener implementieren.
|
public void itemStateChanged( ItemEvent e )
{
JCheckBox cb = (JCheckBox) e.getItemSelectable();
System.out.println( cb.getLabel() + ": " + cb.isSelected() );
}
|
|