Wie lässt sich ein Auswahlmenu erzeugen?
Eine JComboBox
stellt eine Menu-Komponente dar,
die etwa einem HTML-Select entspricht und die die Auswahl aus
einer Reihe von Optionen ermöglicht.
Verwedung ohne Model
Im einfachsten Fall können die Auwahlmöglichkeiten entweder einzeln dem leeren JComboBox-Objekt hinzugefügt oder als Array bzw. Vector dem Konstruktor bei der Objektbildung übergeben werden. Es muss sich aber um Objekte handeln, primitive Typen können nicht eingefügt werden.
public class AuswahldialogEins { public AuswahldialogEins() { init(); } private void init() { String[] classics = { "Norton", "Brough Superior", "Vincent", "Matchless" }; JComboBoxclassicBox = new JComboBox (classics); classicBox.addItem("Scott"); classicBox.setMaximumRowCount(3); classicBox.addActionListener( e -> System.out.println(classicBox.getSelectedIndex() + ": " + classicBox.getSelectedItem())); JFrame frame = new JFrame("Classics"); frame.add(classicBox); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new AuswahldialogEins()); } }
Das erste Beispiel zeigt einen solchen Fall. In init()
wird zunächst ein String-Array gebildet, das im
nächsten Schritt dem Konstruktor einer JComboBox
bei der Objektbildung übergeben wird. Zur Demonstration
wird den eingefügten Objekten durch die Methode addItem()
noch ein weiterer String hinzugefügt. Er wird am Ende
angehängt. Eine Möglichkeit, den String an einer
anderen definierten Stelle einzufügen, existiert auf diese
Weise nicht.
Will man die Darstellungslänge der Box
beschränken, so ist dies mit setMaximumRowCount()
möglich. Die als Parameter anzugebende Länge ist
diejenige, die als Maximallänge ohne Scrollleiste
dargestellt wird.
Verwendung eines Models
Die Bezeichnung Model
entstammt dem Entwurfsmuster
Model-View-Controller. Es stellt eine Struktur dar, die
zur Verwaltung der Daten einer Anwendung oder Komponente dient.
In Java wird dies, wie im folgenden Beispiel auch, i.A. durch
eine gesonderte Klasse realisiert.
public class AuswahldialogZwei { public AuswahldialogZwei() { init(); } private void init() { String[] classics = { "Norton", "Brough Superior", "Vincent", "Matchless" }; DialogModel dialogModel = new DialogModel(classics); dialogModel.insertElementAt("Ariel", 1); JComboBox<Object> classicBox = new JComboBox<Object>(dialogModel); dialogModel.addElement("Scott"); classicBox.setMaximumRowCount(3); classicBox.addActionListener( e -> System.out.println(classicBox.getSelectedIndex() + ": " + classicBox.getSelectedItem())); JFrame frame = new JFrame("Classics"); frame.add(classicBox, BorderLayout.CENTER); JButton butt = new JButton("sortieren"); butt.addActionListener(e -> dialogModel.sort()); frame.add(butt, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new AuswahldialogZwei()); } } class DialogModel extends DefaultComboBoxModel<Object> { public DialogModel(Object[] obj) { super(obj); } public void sort() { ArrayList<Object> list = new ArrayList<Object>(); int i=0; while (super.getElementAt(i) != null){ list.add(super.getElementAt(i)); i++; } Object[] objs = (Object[]) list.toArray(new Object[0]); Arrays.sort(objs); super.removeAllElements(); for (int j = 0; j < objs.length; j++) { super.addElement(objs[j]); } } }
Zur Verwaltung der Daten einer JComboBox
stellt
Java die Klasse DefaultComboBoxModel
bereit, die
eine Reihe an Methoden für die Verwaltung der Daten bereits
mitbringt. Durch Erweitern der Klasse können
zusätzliche Verwaltungsfunktionen hinzugefügt werden.
Dies wird hier am Beispiel der Sortierung der Daten
demonstriert.
Die Model-Klasse DialogModel
besitzt im
vorliegenden Fall lediglich einen Konstruktor, der ein
Datenarray entgegennimmt, sowie eine Methode für die
Zusatzfunktion der Sortierung dieser Daten. Im Konstruktor wird
das Datenarray durch Aufruf von super
an die
Superklasse DefaultComboBoxModel
übergeben,
sodass deren Verwalungsmethoden zur Verfügung stehen.
Die Methode sort()
schafft die Möglichkeit,
die gespeicherten Daten zu sortieren, da die Superklasse keine
derartige Funktion bereitstellt.
Hierzu wird als
Zwischenspeicher eine ArrayList
erzeugt, der innerhalb einer while-Schleife
nacheinander die gespeicherten Elemente hinzugefügt werden.
Auf diese wird mittels der Superklassen-Methode getElementAt()
zugegriffen. Eine ArrayList
wird hier verwendet,
weil die Anzahl der gespeicherten Elemente unbekannt ist.
In
den folgenden beiden Schritten wird die Liste dann zunächst
in ein Array gewandelt, das anschließend sortiert wird. Der
Ausdruck super.removeAllElements();
entfernt dann
alle bisherigen Elemente aus dem Model, um die sortierten
Elemente anschließend aus dem Zwischenspeicher wieder
hinzuzufügen. Das Model enthält nun einen einfachen,
sortierten Satz aller Elemente.
In Abänderung des obigen Beispiels wird das durch die JComboBox
darzustellende Array nun in init()
nicht der Box
selbst, sondern über den Konstruktor einem Objekt des neu
gebildeten Models hinzugefügt. Auch weitere Auswahlobjekte
werden anschließend nun dem Model statt der JComboBox
angefügt. Das Model wird dann dem Konstruktor der JComboBox
bei dessen Instanzierung übergeben.
Im Programmfenster wird nun zusätzlich noch ein Button
erstellt, dessen ActionListener bei Aktivierung die o.a.
Modelmethode sort()
aufruft. Bemerkenswert ist
hier, dass die durch die Methode angestoßene Sortierung
automatisch auch durch die JComboBox
übernommen wird.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.