Wie lässt sich der Inhalt einer JComboBox sortieren?

Eine JComboBox, im Deutschen auch als Auswahldialog, Auswahlkomponente oder Dropdown-Menu bezeichnet, lässt sich nur über einen kleinen Umweg 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.