Wir können ja mal schnell eine Anwendung schreiben. Ich nehme mal Personen mit Vor- und Nachnamen.
Kümmern wir uns erstmal um die Daten:
[code lang=Java title=Person.java]
import java.util.Objects;
class Person {
private final String name;
private final String firstName;
public Person(String name, String firstName) {
this.name = name;
this.firstName = firstName;
}
public String name() {
return name;
}
public String firstName() {
return firstName;
}
@Override
public boolean equals(Object o) {
if (o == null || o == this || !(o instanceof Person)) {
return o == this;
}
Person other = (Person) o;
return Objects.equals(name, other.name) && Objects.equals(firstName, other.firstName);
}
@Override
public int hashCode() {
return Objects.hash(name, firstName);
}
@Override
public String toString() {
return name + ", " + firstName;
}
}
[/code]
So, jetzt brauchen wir ein UI, das die Liste verwalten kann. Da packen wir eine JList, zwei Textfelder und einen Button rein. Auf ansprechendes Layout verzichte ich mal. Das UI soll mit einem PersonListModel arbeiten, das man beim Erstellen der PersonView mitgeben kann:
[code lang=Java title=PersonView.java]
import java.awt.GridLayout;
import java.util.Objects;
import javax.swing.*;
class PersonView {
private JTextField name = new JTextField();
private JTextField firstName = new JTextField();
private PersonListModel persons;
public PersonView(PersonListModel persons) {
Objects.requireNonNull(persons);
this.persons = persons;
}
public JFrame show() {
JList<Person> list = new JList<>();
list.setModel(persons);
name = new JTextField(20);
firstName = new JTextField(20);
JButton createButton = new JButton("Person erstellen");
createButton.addActionListener(e -> createPerson());
JPanel editor = new JPanel();
JPanel editorContents = new JPanel(new GridLayout(0,1));
editorContents.add(new JLabel("Name:"));
editorContents.add(name);
editorContents.add(new JLabel("Vorname:"));
editorContents.add(firstName);
editorContents.add(new JLabel(" "));
editorContents.add(createButton);
editor.add(editorContents);
JPanel panel = new JPanel(new GridLayout(0,2));
panel.add(new JScrollPane(list));
panel.add(editor);
JFrame frame = new JFrame("Personen");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setVisible(true);
return frame;
}
private void createPerson() {
Person person = new Person(name.getText(), firstName.getText());
persons.add(person);
}
}
[/code]
Das PersonListModel dient als Adapter, um eine java.util.List von Personen an z. B. eine JList anzubinden:
[code lang=Java title=PersonListModel.java]
import javax.swing.ListModel;
import javax.swing.AbstractListModel;
import java.util.List;
import java.util.Objects;
class PersonListModel extends AbstractListModel<Person> {
private List<Person> persons;
public PersonListModel(List<Person> persons) {
Objects.requireNonNull(persons);
this.persons = persons;
}
public void add(Person person) {
int ix = getSize();
if (persons.add(person)) {
fireIntervalAdded(this, ix, ix); // registrierte Beobachter (wie JList) benachrichtigen
}
}
@Override
public int getSize() {
return persons.size();
}
@Override
public Person getElementAt(int ix) {
return persons.get(ix);
}
}
[/code]
Die Implementierung ist ziemlich poplig und kein Hexenwerk. Die add-Methode ist allerdings nicht ganz korrekt, weil sie einfach davon ausgeht, dass neue Personen ans Ende angefügt werden. Da ich aber nur eine ArrayList verwenden werde, reicht mir das zu Demonstrationszwecken.
Was fehlt noch? Ach so, das Zusammenstellen zu einer Anwendung:
[code lang=Java title=App.java]
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class App {
private List<Person> persons = new ArrayList<>();
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new App().show());
}
public App() {
// ein wenig Vorbelegung
persons.add(new Person("Dampf", "Hans"));
persons.add(new Person("Bolika", "Anna"));
persons.add(new Person("Wurst", "Hans"));
persons.add(new Person("Baumeister", "Bob"));
}
public void show() {
PersonListModel personModel = new PersonListModel(persons);
PersonView view = new PersonView(personModel);
JFrame frame = view.show();
// zu Demonstrationszwecken, dass sich die ArrayList auch
// wirklich aendert, gebe ich beim Schliessen des Fensters
// einfach mal die Liste aus
frame.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
persons.forEach(System.out:

rintln);
}
});
}
}
[/code]