Swing Model an View binden

magna

Mitglied
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:

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());

    }

}
Um auf die Änderungen in den Formularfeldern zu reagieren kam mir folgende Idee, von der ich aber noch nicht wirklich überzeugt bin:

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:

Marco13

Top Contributor
Was du mit "welche Eigenschaft" meinst ist nicht ganz klar. Geht es darum, dass das Modell vielleicht ZWEI Methoden hat
setProp1(...)
setProp2(...)

Und es demnach ZWEI TextFields gibt, und beide den gleichen DocumentListener haben, der dann bei
Code:
public class MyForm extends MyView implements DocumentListener {
 
    public void changedUpdate(final DocumentEvent e) { update(); }
    public void insertUpdate(final DocumentEvent e) { update(); }
    public void removeUpdate(final DocumentEvent e) { update(); }

    private void update()
    {
        model.setProp[b] ja welche denn? [/b](...);
    }
}
nicht weiß, was er machen soll?
 

magna

Mitglied
Was du mit "welche Eigenschaft" meinst ist nicht ganz klar. Geht es darum, dass das Modell vielleicht ZWEI Methoden hat
setProp1(...)
setProp2(...)
nicht weiß, was er machen soll?

Genau! Das wird aus meinem Code nicht wirklich klar, weil ich ihn der besseren Lesbarkeit wegen stark gekürzt habe. Mein reales Model besteht aus über 50 Eigenschaften (Properties), die zudem auch andere Datentypen haben können als Integer und auch als andere Formularfeldtypen als JTextField dargestellt sein können. Daß ich deshalb keinen einheitlichen Ansatz verfolgen kann ist mir klar, aber wie kann ich es vermeiden für jede dieser 50+ Eigenschaften einen eigenen DocumentListener (oder entsprechendes) zu schreiben?

Danke für deine schnelle Antwort.

Dein Ansatz mit der update()-Methode die in den anderen nur aufgerufen wird gefällt mir aber schonmal sehr gut.
 

Marco13

Top Contributor
EDIT: Ach, es geht auch um anderes als String und JTextField - naja, zumindest bräuchte man für jede "Kombination" die Auftaucht einen solchen Reflection-Listener (z.B. JCheckBox für Booleans, JTextField für String usw...)


Hmmm.. schwierig. Eigentlich wäre der Standardansatz da tatsächlich so, dass man für jede Eigenschaft einen Listener schreiben würde. Wenn diese Properties alle Strings sind, ist es IMHO schonmal... seltsam, dass das Modell da nicht eine Alternative anbietet. Wenn das Modell sowas hätte wie
model.setProperty("PROPERTY_NAME", propertyValue);
wäre das ganze ja einfach.

So... würde das IMHO erstmal nur mit reflection gehen, im Sinne von
Java:
nameTextField.add(createDocumentListener("setName"));
colorTextField.add(createDocumentListener("setColor"));
...

private DocumentListener createDocumentListener(String methodName)
{
    final Method method = holDirMitReflectionDieMethod(methodName);
    return new DocumentListener()
    {
        ... wie oben...

        private void update()
        {
            ...
            method.invoke(model, stringDerGesetztWerdenSoll);
        }
    };
}

Allerdings sollte man sich das genau überlegen: Durch Reflection hat man keine Compilezeit-Überprüfung mehr, die Refactoring-Mechanismen fallen weg ... man KANN damit viel Mist machen.
In diesem Fall könnte es aber OK sein, erstpart einem zumindest 49 repititive DocumentListener-Implementierungen...


EDIT2: Es gibt AFAIK auch Frameworks, die einem viel von dieser Arbeit abnehmen, aber ein konkretes weiß ich jetzt nicht. Wildcard kennt sich da glaubich sher gut aus ???:L
 
Zuletzt bearbeitet:

magna

Mitglied
Super! Das ist doch schonmal ein Ansatz ...

Ich weiß, daß Apache Commons mit seinen BeanUtils die Reflection-API kapselt und so einen deutlich einfacheren Zugriff darauf ermöglicht. Hab mich mit Reflection nämlich noch nicht beschäftigt, meine nur gelesen zu haben, daß es nicht ganz trivial sei damit zu arbeiten.

Mich wundert nur, daß es keine gängige und einfache Lösung mit Java-Bordmitteln gibt, die eben dieses Wiederholen von Code vermeidet.

Dir aber ein dickes Danke!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
R Swing Designfrage - Zusammenspiel Model / View AWT, Swing, JavaFX & SWT 10
J Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen AWT, Swing, JavaFX & SWT 2
D Swing JTable Model View Problem AWT, Swing, JavaFX & SWT 6
K JSpinner - Model <-> View, unterschiedliche Werte AWT, Swing, JavaFX & SWT 9
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
C Model View Controller - Beispielimplementation AWT, Swing, JavaFX & SWT 5
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
S UI Model Binding AWT, Swing, JavaFX & SWT 7
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
B JavaFX mvvmfx - Model AWT, Swing, JavaFX & SWT 3
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
M JList Model filtern AWT, Swing, JavaFX & SWT 4
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
P jTable model setzen AWT, Swing, JavaFX & SWT 6
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
earlgrey_tea JTextfield Model AWT, Swing, JavaFX & SWT 14
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
O Swing JTable - Zeilen färben (mit Model) AWT, Swing, JavaFX & SWT 13
C Swing JTable verbindet sich nicht mit Model AWT, Swing, JavaFX & SWT 20
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
C Swing MVC Verbindung von Model und Db AWT, Swing, JavaFX & SWT 23
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
K Swing JTable Model aktualisieren AWT, Swing, JavaFX & SWT 2
C Swing JComboBox probleme bei Set Model AWT, Swing, JavaFX & SWT 5
T JTable Model AWT, Swing, JavaFX & SWT 5
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
Z JLIST / Model erster EINTRAG AWT, Swing, JavaFX & SWT 11
G Model,Listener und background jobs AWT, Swing, JavaFX & SWT 4
X Swing JList -> Daten anders darstellen als im Model hinterlegt -> möglich ? AWT, Swing, JavaFX & SWT 9
N Model Aktualisieren AWT, Swing, JavaFX & SWT 4
N Swing JComboBox: Auf Model- und Selectionänderungen reagieren AWT, Swing, JavaFX & SWT 2
D JTable, Model, Fokus AWT, Swing, JavaFX & SWT 3
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
S JList mit Vector als Model? AWT, Swing, JavaFX & SWT 12
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
J JTable Model laesst sich nicht serialisieren? AWT, Swing, JavaFX & SWT 16
D ComboBox(Model) mit dummyItem AWT, Swing, JavaFX & SWT 10
G JComboBox mit eigenem Model vorhanden, wie selektieren AWT, Swing, JavaFX & SWT 29
M MVC: Grundidee verstanden aber was machen mit mehreren Model AWT, Swing, JavaFX & SWT 2
V JList ist leer -Model ist voll. Ja, ne is klaaa. AWT, Swing, JavaFX & SWT 8
W Suche großes vollständiges Swing GUI Beispiel nach MVC Model AWT, Swing, JavaFX & SWT 5
P jTable mit Model lässt sich nicht neu laden AWT, Swing, JavaFX & SWT 5
P JTable/Model füllen mit Fortschrittsbalken, Var. Rückgabetyp AWT, Swing, JavaFX & SWT 2
J model von jcombobox AWT, Swing, JavaFX & SWT 4
D Swing und MVC und doppeltes Model? AWT, Swing, JavaFX & SWT 5
G JTable und Model AWT, Swing, JavaFX & SWT 21
J JTable / Model Daten verändern AWT, Swing, JavaFX & SWT 5
C [JTable] ArrayIndexOutOfBoundsException im Model AWT, Swing, JavaFX & SWT 8
Icewind Jlist zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
Icewind JTable zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
G Neues Model für JTextField erstellen AWT, Swing, JavaFX & SWT 8
A Gemeinsames Model für Baum- und Graphdarstellung-wie gehts? AWT, Swing, JavaFX & SWT 9
S Frage zu Table(Column)Model AWT, Swing, JavaFX & SWT 3
H Model umbauen ? AWT, Swing, JavaFX & SWT 5
J Table Model AWT, Swing, JavaFX & SWT 2
J Abstract Table Model AWT, Swing, JavaFX & SWT 7
D Model Listener beim JTree AWT, Swing, JavaFX & SWT 5
S JavaFX Fehler zwischen View und Controller bei MouseEvent (MVC) AWT, Swing, JavaFX & SWT 13
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
M JavaFX - Array in View auslesen AWT, Swing, JavaFX & SWT 12
4a61766120617274697374 dynamische Tree View AWT, Swing, JavaFX & SWT 2
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
M SWT View nicht mehr sichtbar AWT, Swing, JavaFX & SWT 2
G JavaFX "Framework" zur View Ersellung AWT, Swing, JavaFX & SWT 0
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
T View AccessibleContext AWT, Swing, JavaFX & SWT 0
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
S Swing JPanel in View ersetzen AWT, Swing, JavaFX & SWT 10
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
L View aus dem MVC ist immer die GUI? AWT, Swing, JavaFX & SWT 5
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
Rudolf Swing Baut die View die Modelebene auf oder wer? AWT, Swing, JavaFX & SWT 13
G Swing MVC / View - Controller AWT, Swing, JavaFX & SWT 7
N MVC - Logik zum Verändern der View AWT, Swing, JavaFX & SWT 8
V Eclipse View Right-Click Menu hinzufügen AWT, Swing, JavaFX & SWT 2
D Drag-Action: Innerhalb meiner View? AWT, Swing, JavaFX & SWT 3
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
H shell in view implementieren; menu mit keystroke unterlegen AWT, Swing, JavaFX & SWT 8
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
H Swing JScrollPane mit JPanel als View AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben