Ich habe angefangen mich mit Swing zu beschäftigen und möchte nun eine kleine Anwendung erstellen und habe mich für die MVC-Architektur entschieden.
Wie ich nun bei Änderungen im Model auch die Views aktualisiere habe ich herausgefunden. Wie kann ich aber nun Werte des Models ändern, wenn ich Werte im View (Formular) ändere?
Zunächst hatte ich folgenden Code:
Um auf die Änderungen in den Formularfeldern zu reagieren kam mir folgende Idee, von der ich aber noch nicht wirklich überzeugt bin:
Was mich vor allem an diesem Ansatz stört ist die Tatsache, daß ich in den Methoden der Schnittstelle DocumentListener nicht weiß welche Eigenschaft des Models ich anzupassen habe. Alternativ könnte man natürlich für jede Eigenschaft des Models eine eigene Klasse schreiben die die Schnittstelle DocumentListener implementiert, aber das würde die Menge des Codes ja wahnsinnig aufblähen.
Wie macht man das also "richtig"? Für Anregungen Links und Verrisse meines Codes wäre ich dankbar!
Wie ich nun bei Änderungen im Model auch die Views aktualisiere habe ich herausgefunden. Wie kann ich aber nun Werte des Models ändern, wenn ich Werte im View (Formular) ändere?
Zunächst hatte ich folgenden Code:
Java:
public class MyModel extends Observable implements Serializable {
private Integer prop1 = null;
public Integer getProp1() {
return prop1;
}
public void setProp1(Integer prop1) {
this.prop1 = prop1;
setChanged();
}
}
public class MyView extends JPanel implements Observer {
JTextField prop1 = new JTextField(10);
public MyView(final Observable model) {
setBorder(BorderFactory.createEtchedBorder());
setLayout(new GridBagLayout());
// LazyGridBagConstraints ist eine eigene Klasse!
LazyGridBagConstraints c = new LazyGridBagConstraints();
add(new JLabel("prop1"), c.nextCol());
add(prop1, c.nextCol());
model.addObserver(this);
update(model, null);
}
public void update(final Observable observable, final Object object) {
MyModel myModel = (MyModel) observable;
prop1.setText(null == myModel.getProp1() ? null : myModel.getProp1().toString());
}
}
Java:
public class MyForm extends MyView implements DocumentListener {
public MyForm(final Observable model) {
super(model);
prop1.getDocument().addDocumentListener(this);
}
public void changedUpdate(final DocumentEvent e) {
// TODO
}
public void insertUpdate(final DocumentEvent e) {
// TODO
}
public void removeUpdate(final DocumentEvent e) {
// TODO
}
}
Was mich vor allem an diesem Ansatz stört ist die Tatsache, daß ich in den Methoden der Schnittstelle DocumentListener nicht weiß welche Eigenschaft des Models ich anzupassen habe. Alternativ könnte man natürlich für jede Eigenschaft des Models eine eigene Klasse schreiben die die Schnittstelle DocumentListener implementiert, aber das würde die Menge des Codes ja wahnsinnig aufblähen.
Wie macht man das also "richtig"? Für Anregungen Links und Verrisse meines Codes wäre ich dankbar!
Zuletzt bearbeitet: