Wie lässt sich ein Auswahlmenu erzeugen?

Ein Auswahlmenu lässt sich mit einer JComboBox realisieren. Sein Inhalt wird meist in einem Model verwaltet.

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 AuswahlkomponenteEins extends JFrame {

    public AuswahlkomponenteEins() {
        init();
    }

    private void init() {
        String[] classics = { "Norton", "Brough Superior", "Vincent",
                "Matchless" };
        JComboBox<String> classicBox = new JComboBox<String>(classics);
        classicBox.addItem("Scott");
        classicBox.setMaximumRowCount(3);
        classicBox.addActionListener(
                e -> System.out.println(classicBox.getSelectedIndex() + ": "
                        + classicBox.getSelectedItem()));
        this.add(classicBox);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Classics");
        this.setSize(200, 100);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new AuswahlkomponenteEins();
    }
}

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 AuswahlkomponenteZwei extends JFrame {
    
    public AuswahlkomponenteZwei() {
        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()));
        this.add(classicBox, BorderLayout.CENTER);
        JButton butt = new JButton("sortieren");
        butt.addActionListener(e -> dialogModel.sort());
        this.add(butt, BorderLayout.SOUTH);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Classics");
        this.setSize(200, 100);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new AuswahlkomponenteZwei();
    }
}

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.