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.
Dort unter "Swing GUI forms" ein "JDialog form" wählen:
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:
- Parent-Fenster - bei einem modalen Dialog ist dies das Fenster, zu dem sich der Dialog modal verhält.
- Boolean mit der Angabe "modal" (also: solange der Dialog angezeigt wird, kann man nicht auf das Fenster im Hintergrund klicken). Hier sollte bei Dialogen natürlich immer "true" übergeben werden.
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:
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.
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.
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:
Danach setzt man eine "List" in dieses ScrollPane - es wird automatisch auf den vollen Bereich des ScrollPane vergrößert.
Anschließend erfolgen die gleichen Schritte wie bei der ComboBox:
- Der "Type Parameter" wird auf
Student
geändert.
- Das generierte Model wird zurückgesetzt.
- Im Konstruktor erfolgt das Füllen anhand eines
DefaultComboBoxModel<Student>
.
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.
Über das Event valueChanged
erfährt man, wenn sich die Auswahl ändert.
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
.
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.