15.11 Ein Auswahlmenü - Choice, JComboBox
Ein Auswahlmenü (engl. choice box, auch combo box) zeigt eine Zeichenkette aus einer Liste von Möglichkeiten an. Wird die Choice-Box aufgeklappt, kann ein Element aus der List-Box gewählt werden. Ein neuer Eintrag erscheint dann im Titel des Menüs. Unter dem AWT stellt die Klasse Choice ein Auswahlmenü zur Verfügung. Die JComboBox ist das Swing-Auswahlmenü, welches zudem ein Textfeld zur Eingabe anbietet. In diesem Textfeld können Texte in beliebigen Modellen dargestellt und ausgewählt werden; ein Tastendruck lässt die Liste zu dem Eintrag springen, dessen Buchstabe eingegeben wurde. Ob das Textfeld editiert werden kann, bestimmt setEditable(). Befinden sich zu viele Einträge in der Liste, stellt Swing automatisch eine scrollende Liste dar. Ab welcher Anzahl von Elementen die scrollende Liste dargestellt wird, bestimmt setMaximumRowCount(). Mit addItem() lassen sich Elemente hinzufügen, mit removeItem() wieder entfernen. Mit getItemAt(index) lassen sich die Elemente erfragen, das aktuell ausgewählte Element erfahren wir mit getSelectedItem() und den Index mit getSelectedIndex().
Hier klicken, um das Bild zu Vergrößern
Abbildung 15.9 Beispiel einer JComboBox
Beim Auswählen eines Eintrags wird ein ItemEvent ausgelöst, mit dem wir den ausgewählten String erfragen können. Das JComboBox-Objekt bietet Methoden, mit denen Zeichenketten eingefügt und entfernt werden können.
Listing 15.15 JComboBoxDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBoxDemo
{
public static void main( String args[] )
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
String lang[] = {
"Java", "C++", "Perl", "Cobol", "Forth",
"Lisp", "Eiffel", "Smalltalk", "Apl",
"Ende"
};
// Erste Combo-Box
JComboBox combo1 = new JComboBox();
for ( int i = 0; i < lang.length; i++ )
combo1.addItem( lang[i] );
frame.getContentPane().add( combo1, BorderLayout.WEST );
combo1.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
JComboBox selectedChoice = (JComboBox)e.getSource();
if ( selectedChoice.getSelectedItem().equals("Ende") )
System.exit(0);
}
});
// Zweite Combo-Box
JComboBox combo2 = new JComboBox( lang );
combo2.setEditable( true );
combo2.setSelectedItem( "Sather" );
combo2.setMaximumRowCount( 4 );
frame.getContentPane().add( combo2, BorderLayout.EAST );
frame.pack();
frame.show();
}
}
Die Methode addItem() funktioniert nur dann, wenn im Konstruktor kein spezielles Modell angegeben wurde. Mit Modellen werden wir uns zu einem späteren Zeitpunkt näher beschäftigen. Sehen wir uns zunächst die Konstruktoren an.
class javax.swing.JComboBox
extends JComponent
implements ItemSelectable, ListDataListener, ActionListener, Accessible
|
|
JComboBox()
Erzeugt ein leeres Auswahlmenü mit einem Standardmodell. |
|
JComboBox( Object items[] )
Erzeugt ein Auswahlmenü mit Elementen, die im Feld items angegeben sind. |
|
JComboBox( Vector items )
Erzeugt ein Auswahlmenü mit Elementen, die im Vektor items abgelegt sind. |
|
JComboBox( ComboBoxModel aModel )
Erzeugt ein Auswahlmenü mit einem Combo-Box-Modell, welches die Daten speichert. |
Elemente lassen sich jetzt hinzufügen und löschen. Etwas seltsam ist, dass die JComboBox selbst diese Methoden anbietet. Ähnliche Swing-Komponenten (wie die JList oder JTable) bieten diese Anfrage- und Veränderungsmethoden nicht an, sondern erwarten direkt eine Änderung am Modell und nicht an der Komponente. Das Besondere bei Swing-Komponenten ist ja gerade, dass das Modell verändert und abgefragt wird. Im Fall der JComboBox speichert sie die Daten natürlich immer noch nicht selbst, sondern leitet sie an das Modell weiter. So sind diese Methoden nur Durchreiche-Methoden.
|
void addItem( Object anObject )
Fügt dem Modell einen Eintrag hinzu. |
|
Object getItemAt( int index )
Liefert den Eintrag an der Position index. Die Rückgabe ist null, wenn der Index außerhalb des Bereichs ist. |
|
int getItemCount()
Liefert die Anzahl der Einträge im Auswahlmenü. |
|
void insertItemAt( Object anObject, int index )
Fügt einen Eintrag an eine bestimmte Stelle ein. |
|
void removeItem( Object anObject )
Löscht den Eintrag aus der Liste. |
|
void removeItemAt( int position )
Löscht den Eintrag an der Position position. |
|
void removeAll()
Entfernt alle Einträge aus dem Auswahlmenü. |
Zur Selektion beziehungsweise Abfrage selektierter Elemente bietet die Klasse weitere Funktionen an:
|
Object getSelectedItem()
Liefert die aktuelle Wahl zurück. |
|
Object[] getSelectedObjects()
Liefert ein Array mit den selektierten Einträgen. |
|
int getSelectedIndex()
Liefert den Index des aktuell selektierten Eintrags. |
|
void setSelectedIndex( int position )
Setzt den Eintrag im Titel des Menüs auf den Eintrag mit der Nummer position. |
|
void setSelectedItem( Object anObject )
Setzt den Eintrag string in die Titelleiste, wenn dieser in der Liste ist. Falls mehrere Einträge gleich dem string sind, wird der Eintrag verwendet, der zuerst gefunden wurde. Dieser besitzt dann also den kleinsten Index. |
Ein ItemListener empfängt selektierte Elemente. Ein ActionListener reagiert, wenn die Box editierbar ist und der Benutzer eine Eingabe tätigt. Seit Java 1.4 lässt sich auch ein PopupMenuListener hinzufügen.
|
void addItemListener( ItemListener aListener )
Hängt einen ItemListener an das Auswahlmenü an. |
|
void removeItemListener( ItemListener aListener )
Löst den ItemListener vom Auswahlmenü. |
15.11.1 ItemListener
Die Schnittstelle ItemListener wird von allen Objekten implementiert, die an einem Auswahlereignis interessiert sind. Wird ein Element ausgewählt, wird die Methode itemStateChanged() vom Objekt auf allen registrierten ItemListenern aufgerufen. Folgende Komponenten besitzen Einträge und können dementsprechend ItemChanged-Ereignisse auslösen: Checkboxen, Checkbox-Menüeinträge, Choice-Menüs und Listen.
Beispiel Die Methode itemStateChanged() soll in Abhängigkeit von der Auswahl ein JLabel-Objekt mit dem Namen label sichtbar oder unsichtbar machen.
public void itemStateChanged( ItemEvent e )
{
label.setVisible( e.getStateChange() == ItemEvent.SELECTED );
}
|
interface java.awt.event.ItemListener
extends EventListener
|
|
void itemStateChanged( ItemEvent e )
Wird aufgerufen, wenn ein Eintrag selektiert oder deselektiert wird. |
Die Funktion itemStateChanged() hat als Parameter ein ItemEvent-Objekt.
Hier klicken, um das Bild zu Vergrößern
class java.awt.event.ItemEvent
extends AWTEvent
|
|
ItemSelectable getItemSelectable()
Gibt ein ItemSelectable-Objekt von der Komponente zurück, die das Ereignis ausgelöst hat. |
|
Object getItem()
Gibt den Eintrag der Liste zurück. |
|
int getStateChange()
Gibt den Status des Eintrags zurück. Die Klasse definiert dazu die Konstanten Item Event.SELECTED und ItemEvent.DESELECTED. |
15.11.2 Zuordnung einer Taste mit einem Eintrag
Bei der Benutzung einer JComboBox möchten Benutzer gerne Elemente schnell per Tastatur auswählen. Ist etwa eine sortierte Auswahl mit Zeichenketten gegeben, dann sollte ein getippter Buchstabe zum ersten Eintrag führen, der mit diesem Buchstaben beginnt. Diese Funktionalität ist in Swing schon vorprogrammiert, kann aber noch erweitert werden. Dazu gilt es, einen KeySelectionManager zu implementieren. Dieser verbindet mit der gedrückten Taste (char) einen Index in der ComboBox (int).
Beispiel Das Beispiel soll zeigen, wie eine Liste mit den ersten Buchstaben des Alphabets mit der Tastenauswahl 1, 2, 3 verbunden wird. Der interessanteste Teil ist die innere Klasse, die die Schnittstelle JComboBox.KeySelectionManager implementiert.
|
Listing 15.16 JComboBoxKeySelection.java
import javax.swing.*;
class JComboBoxKeySelection
{
public static void main( String args[] )
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
// Erste Combo-Box
JComboBox cb = new JComboBox() { {
addItem( "A" ); addItem( "B" ); addItem( "C" );
}
};
cb.setKeySelectionManager( new JComboBox.KeySelectionManager()
{
public int selectionForKey( char aKey, ComboBoxModel aModel )
{
int pos = Math.abs( aKey - 1 - '0' );
return pos >= aModel.getSize() ? aModel.getSize() - 1 : pos;
}
} );
frame.getContentPane().add( cb );
frame.pack();
frame.show();
}
}
Die Methode selectionForKey() bekommt den ausgewählten Buchstaben und das Modell. Dieses Modell ist nicht so unnötig, wie es auf den ersten Blick erscheint, denn es ist wichtig, aus ihm die maximale Anzahl Elemente auszulesen, damit es nicht zu einer fehlerhaften Rückgabe kommt. Eine Bedingung testet, ob eine Auswahl getätigt wird, die zu einem ungültigen Eintrag führen würde.
|