Swing Basics (Teil 2)

Dieses Beispiel zeigt, wie ein Dialog angelegt wird und wie ComboBox, eine ListBox oder ein TextArea funktionieren.
Das Projekt befindet sich unter "SwingBasics2" in Gitlab: https://gitlab.cs.hs-rm.de/knauf/swt-ws19-knauf/tree/master/SwingBasics2

Der Code ist auch hier zu finden: SwingBasics2.zip

Dialog hinzufügen

Rechtsklick auf das Projekt, "New" => "Other" aufrufen.
New Dialog
Dort unter "Swing GUI forms" ein "JDialog form" wählen:
JDialog hinzufügen
Nicht vergessen: die generierte main-Methode rauslöschen, um Verwirrung zu vermeiden.

Anzeige des Dialogs:
        SimpleDialog dialog = new SimpleDialog(this, true);
        dialog.setVisible(true);
Der generierte Konstruktor hat zwei Parameter:
Mein Beispieldialog SimpleDialog zeigt außerdem, wie man "OK"- und "Abbrechen"-Buttons implementiert und wie man nach dem Schließen des Dialogs im Aufrufer prüft, ob der Dialog mit "OK" geschlossen wurde.

JComboBox

Eine JComboBox kann eine Liste von Items anzeigen. Im einfachsten Fall ist dies eine String-Liste. Man kann allerdings auch eine komplette Datenklasse anzeigen, und dank Generics-Deklaration der ComboBox kann man den Typ der Items angeben. Wichtig ist, dass die Datenklasse toString implementiert - die ComboBox verwendet diese Methode für den Anzeigetext. Dies ist im Beispiel in der Klasse ComboBoxDialog zu finden.

Der Code zu diesem Beispiel ist zu finden in der Klasse ComboBoxDialog.

Über die ToolBox fügt man eine "JComboBox" hinzu.

Datenmodell

Per Default zeigt diese eine String-Liste an. In meinem Beispiel soll sie die Klasse Student anzeigen. Dafür muss man in den Properties die "Type Parameters" ändern: In den Properties auf den Karteireiter "Code" wechseln und in der Zeile "Type Parameters" den Ellipsis-Button ("...") klicken:
ComboBox: Type Parameters
Hier trägt man die Klasse Student ein.

Jetzt hat man Compilefehler in initComponent, weil hier ein ComboBox-Model mit Beispieldaten vom Typ String erzeugt wird:

jComboBoxTest.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
Dies ändert man, indem man in den "Properties" die Zeile "model" anklickt und dort auf den Ellipsis-Button klickt. Dort klickt man auf "Reset to Default". Dadurch wird die ComboBox ohne Datenmodell erzeugt.
ComboBox: Reset model

Im Konstruktor des Dialogs wird im Beispiel die ComboBox befüllt: es wird ein Vector<Student> erzeugt und Studenten-Objekte werden zugefügt. Diese werden an ein javax.swing.DefaultComboBoxModel übergeben, und dieses wird als "Model" in die ComboBox gesetzt:

        Vector<Student> listData = new Vector<Student>();
        Student stud1 = new Student();
        stud1.setMatrikelnummer(1234567);
        stud1.setVorname("Hans");
        stud1.setNachname("Meier");
        listData.add(stud1);

        Student stud2 = new Student();
        stud2.setMatrikelnummer(333444);
        stud2.setVorname("Sybille");
        stud2.setNachname("Müller");
        listData.add(stud2);

        Student stud3 = new Student();
        stud3.setMatrikelnummer(568923);
        stud3.setVorname("Otto");
        stud3.setNachname("Huber");
        listData.add(stud3);

        this.jComboBoxTest.setModel(new DefaultComboBoxModel<Student>(listData));

Auswahl

Über das Event actionPerformed erfährt man, wenn sich die Auswahl ändert.
Combobox: Auswahländerung
Im Beispiel wird die Auswahl in ein JTextField geschrieben:

        this.jTextFieldSelected.setText (this.jComboBoxTest.getSelectedItem().toString());
Umgekehrt kann man über JComboBox.setSelectedItem oder JComboBox.setSelectedIndex eine Auswahl setzen.

Im Beispiel zeigt das MainForm den Dialog an. Hier wird gezeigt, wie der Aufrufer das gewählte Item abrufen kann - es muss eine Methode im Dialog implementiert werden, die das SelectedItem der ComboBox zurückliefert.

JList

Eine JList kann genauso wie die CombBox eine Liste von Items anzeigen. Das heißt es gelten die gleichen Regeln für das Listenmodell wie bei der CombBox. Die Liste kann allerdings auch eine Mehrfachauswahl zulassen.

Der Code zu diesem Beispiel ist zu finden in der Klasse ListDialog.

Damit eine Liste Scrollleisten anzeigt, wenn sie mehr Elemente enthält als in den sichtbaren Bereich passen, muss man zuerst ein "JScrollPane" hinzufügen:
ScrollPane
Danach setzt man eine "List" in dieses ScrollPane - es wird automatisch auf den vollen Bereich des ScrollPane vergrößert.
List hinzufügen
Anschließend erfolgen die gleichen Schritte wie bei der ComboBox:

Auswahl

Über die Property "selectionMode" kann man den Auswahlmodus umschalten. Per Default (und auch im Beispiel) steht er auf "MULTIPLE_INTERVAL", d.h. man kann mit "Strg+Click" mehrere Items wählen. Für eine Einzelauswahl kann man ihn auf "SINGLE" umschalten.
SelectionMode

Über das Event valueChanged erfährt man, wenn sich die Auswahl ändert.
ListBox: Auswahländerung
Bei Mehrfachauswahl ruft man die Liste der gewählten Items über getSelectedValuesList ab, bei Einzelauswahl würde getSelectedValue ausreichen.
Im Beispiel wird die Auswahl in ein JTextField geschrieben:

        String selected = "";
        
        for (Student studentSel : this.jListTest.getSelectedValuesList()) {
            if (selected.length() > 0) {
                selected += ", ";
            }
            selected += studentSel.toString();
        }
        this.jTextFieldSelected.setText(selected);
Umgekehrt kann man über JList.setSelectedIndex oder JList.setSelectedValue (bei Single Selection) bzw. JList.setSelectedIndices (bei Multi Selection) eine Auswahl setzen.

Im Beispiel zeigt das MainForm den Dialog an. Hier wird gezeigt, wie der Aufrufer das gewählte Item abrufen kann - es muss eine Methode im Dialog implementiert werden, die das SelectedItem der ComboBox zurückliefert.


Mehrzeiliger Text

In einen JTextField kann man nur einzeiligen Text eingeben. Für mehrzeiligen Text gibt es ein JTextArea. Wie oben bei der ListBox muss man es auf ein JScrollPane setzen.

Der Code zu diesem Beispiel ist zu finden in der Klasse TextAreaDialog.

JTextArea

Für ein JTextArea gibt es kein einfach zu implementierendes Event, das bei einer Textänderung ausgelöst wird. Hier wird das Änderungsevent vom zugrundeliegenden "
jTextArea.getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {

    @Override
    public void removeUpdate(javax.swing.event.DocumentEvent e) {
        //Text wurde gelöscht oder aktualisiert.
    }

    @Override
    public void insertUpdate(javax.swing.event.DocumentEvent e) {
        //Text wurde eingefügt.
    }

    @Override
    public void changedUpdate(javax.swing.event.DocumentEvent arg0) {
        //Wird hier nicht ausgelöst.
    }
});
changedUpdate wird nicht ausgelöst, wenn nur Plain Text angezeigt wird.
Siehe https://stackoverflow.com/questions/7740465/text-changed-event-in-jtextarea-how-to

Stand 27.11.2019
Historie:
19.11.2019: Erstellt
27.11.2019: JList: "setSelectedIndex" etc. war von JComboBox kopiert. JTextArea: Textänderungsevent.