Hallo zusammen,
für ein privates Projekt stehe ich gerade vor dem Problem, was man macht, wenn man mehrere Modells (also Instanzen von einer Klasse) hat. Für genau eine Instanz von Person sieht das ganze aktuell so aus:
Starterklasse:
Modell:
Btw. muss man hier immer selber die Methoden add, notify etc. implementieren oder gibt es da einen Trick?
Controller:
View:
Btw. ist hier das starten der GUI im EventDispatchThread so richtig?
Wenn ich nun mehrere Personen erstelle und diese mir in der GUI Reihe für Reihe anzeigen lassen möchte, wie kriege ich es dann hin, dass wenn sich eines dieser Objekte ändert, dieses aktualisiert wird?
für ein privates Projekt stehe ich gerade vor dem Problem, was man macht, wenn man mehrere Modells (also Instanzen von einer Klasse) hat. Für genau eine Instanz von Person sieht das ganze aktuell so aus:
Starterklasse:
Code:
package de.javaforum.swingmvc;
import de.javaforum.swingmvc.controller.PersonManager;
import de.javaforum.swingmvc.modell.Person;
public class Main {
public static void main(String[] args) {
Person test = new Person("Test");
new PersonManager(test);
}
}
Code:
package de.javaforum.swingmvc.modell;
import java.util.LinkedList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
public class Person extends Observable {
private String name;
private List<Observer> observers;
public Person(String name) {
this.name = name;
observers = new LinkedList<Observer>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyObservers();
}
@Override
public synchronized void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this, null);
}
}
}
Controller:
Code:
package de.javaforum.swingmvc.controller;
import de.javaforum.swingmvc.modell.Person;
import de.javaforum.swingmvc.view.GUI;
public class PersonManager {
private Person person;
private GUI gui;
public PersonManager(Person person) {
this.person = person;
gui = new GUI(this, person);
gui.show();
}
public void changeName(String name) {
person.setName(name);
}
}
View:
Code:
package de.javaforum.swingmvc.view;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import de.javaforum.swingmvc.controller.PersonManager;
import de.javaforum.swingmvc.modell.Person;
public class GUI implements Observer {
private JFrame frame;
private JTextField nameField;
private JLabel nameLabel;
private Person modell;
private PersonManager controller;
public GUI(PersonManager controller, Person modell) {
this.modell = modell;
this.controller = controller;
this.modell.addObserver(this);
}
public void show() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// text field
nameField = new JTextField(10);
// button
JButton nameButton = new JButton("Change name!");
nameButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
controller.changeName(nameField.getText());
}
});
// label
nameLabel = new JLabel(modell.getName());
// panel
JPanel panel = new JPanel();
panel.add(nameField);
panel.add(nameButton);
panel.add(nameLabel);
// frame
frame = new JFrame("Swing MVC");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
});
}
@Override
public void update(Observable o, Object arg) {
if (o.getClass().equals(Person.class)) {
nameLabel.setText(modell.getName());
}
}
}
Wenn ich nun mehrere Personen erstelle und diese mir in der GUI Reihe für Reihe anzeigen lassen möchte, wie kriege ich es dann hin, dass wenn sich eines dieser Objekte ändert, dieses aktualisiert wird?