Wie lässt sich der Inhalt einer JComboBox sortieren?
Wie im Artikel
über die Auswahlkomponente JComboBox beschrieben, kann der Inhalt
einer JComboBox
auf zweierlei Weise gespeichert
werden: direkt im Objekt der JComboBox
oder in
einem sog. Model1. Leider besitzen
weder die Box- noch die Model-Klasse Methoden, um ihre Daten
direkt zu sortieren. Darüber hinaus gibt es nicht einmal
die Möglichkeit, auf die jeweiligen Einträge im Ganzen
als Array oder Collection zuzugreifen.
Das folgende Beispiel zeigt, wie diese Hürde genommen
werden kann, wenn die Daten direkt dem JComboBox
-Objekt
hinzugefügt wurden. Ein vergleichbares Vorgehen bei
Verwendung eines Models zeigt der Abschnitt
über die Verwendung eines ComboBoxModels im Artikel
über die Auswahlkomponente JComboBox.
public class JComboBoxSort { JComboBox<String> classicBox; public JComboBoxSort() { init(); } private void init() { String[] classics = { "Norton", "Brough Superior", "Vincent", "Matchless" }; classicBox = new JComboBox<String>(classics); classicBox.addItem("Scott"); classicBox.addItem("Ariel"); 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 -> sort()); frame.add(butt, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setLocationRelativeTo(null); frame.setVisible(true); } private void sort() { Object[] o = new Object[classicBox.getItemCount()]; for(int i=0; i<o.length; i++) { o[i] = classicBox.getItemAt(i); } Arrays.sort(o); for(int i=0; i<o.length; i++) { classicBox.removeItemAt(i); classicBox.insertItemAt((String) o[i], i); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new JComboBoxSort()); } }
Im Beispiel wird in init()
ein kleines Fenster
durch einen JFrame
mit einer JComboBox
und einem JButton
erzeugt. Dem JComboBox
-Objekt
wird ein unsortiertes String-Array übergeben, das zur
Demonstration später noch durch zwei weitere Elemente am
Ende ergänzt wird.
Der Button wird dem Fenster unten
hinzugefügt und ruft bei Betätigung die Methode sort()
auf, in der die Sortierung des Inhaltes der Komponente
ausgeführt wird.
Dort wird zunächst ein Array erzeugt, dessen Länge
durch Auslesen der Zahl der Einträge der ComboBox ermittelt
wird. In einer Schleife werden die Elemente durch getItemAt()
geholt und dem Array hinzugefügt. Das gefüllte Array
wird anschließend sortiert und seine Elemente in der dann
erzeugten Reihenfolge der JComboBox
wieder
übergeben. Hierbei ist wichtig, dass alle bisherigen
Elemente vorher entfernt werden, um Doppeleinträge zu
vermeiden. Dies kann entweder im Ganzen durch removeAllItems()
oder, wie hier, durch removeItemAt()
an jeder
Position einzeln erfolgen.
Das erneute Einfügen
aktualisiert nicht nur die Reihenfolge intern, sondern
gleichzeitig auch die Darstellung der
Elementreihenfolge in der ComboBox. Dies beruht darauf, dass
intern die Methode AbstractListModel#fireIntervalAdded()
aufgerufen wird, die dafür sorgt, dass auch das View (die
graphische Repräsentation) der Box hinsichtlich der
Änderung benachrichtigt wird.
1) Intern wird der Inhalt einer JComboBox auch dann in einem ComboBoxModel gespeichert, wenn die Daten der Box direkt hinzugefügt werden.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.