Swing Designfrage - Zusammenspiel Model / View

Rolli

Mitglied
Hi,

schaue mir derzeit das MVC-Pattern an und habe 2 Fragen dazu. Beispielhaft eine simple GUI, welche nur aus einem Eingabefeld, einem Label und einem Button besteht. Gibt man in das Feld eine Zahl ein und betätigt den Button, so erscheint die Zahl im Label.

1) Das Model enthält ja die ganze Programmlogik und soweit ich verstanden habe auch die Daten. Angenommen ich ändere den Wert des Eingabefeldes, dann muss dieses auch im Modelobjekt festgehalten werden oder? Dann würde es ja im Endeffekt gar keine Aufrufe auf die Componenten alla Componente.getText() geben. Stattdessen holt man sich alles aus dem Model?!

2) Woher weiss die View genau, welcher Wert sich geändert hat?

Ich habe mal zwei Lösungsvarianten skizziert:

Fall 1) View ist Observer und stellt die Methode update(Model o) bereit. Ich habe bei jeder Änderung somit Zugriff auf das komplette Model Objekt. Ist es dann üblich, dass man alle Werte aktualisiert (unsere GUI hat jetzt z.B. 5 JLabel anstatt dem einen oben), auch wenn eigentlich nur ein Wert geändert worden ist?
Oder gibt man dem Objekt mit, welche Werte sich geändert haben z.B. in einem Array, welcher die Elemente hält, welche sich geändert haben?

Vorteil: Nur eine Schnittstelle
Nachteil: Ziemlicher Overhead

Fall 2) View ist ebenfalls Observer und stellt aber anstatt einer update Methode für jedes Feld, was sich ändern kann eine Methode bereit. Zum Beispiel updateLabelInfo(Model o), updateLabelSize(Model o). Das Model ruft dann dementsprechend diese Methode auf und die View weiss dann auch genau, welches Element sich genau ändern muss?

Vorteil: Klare Zuordnung möglich (geringer Overhead)
Nachteil: Ziemlich viel Schnittstellenimplementierung

Bin gespannt auf Eure Antworten :)

VG Rolli
 

Michael...

Top Contributor
Beispielhaft eine simple GUI, welche nur aus einem Eingabefeld, einem Label und einem Button besteht. Gibt man in das Feld eine Zahl ein und betätigt den Button, so erscheint die Zahl im Label.
Für so einen Anwendungsfall ist das MVC eventuell etwas Overhead ;-) Aber um das Prinzip zu verstehen...
1) Das Model enthält ja die ganze Programmlogik und soweit ich verstanden habe auch die Daten.
Das Model enthält die Daten. Welche Programmlogik sollte es Deiner Meinung nach enthalten?
Angenommen ich ändere den Wert des Eingabefeldes, dann muss dieses auch im Modelobjekt festgehalten werden oder? Dann würde es ja im Endeffekt gar keine Aufrufe auf die Componenten alla Componente.getText() geben. Stattdessen holt man sich alles aus dem Model?!
Und wie soll man an den Inhalt des Textfeldes kommen? Beim Drücken des Buttons holt sich der Controller den Inhalt des Textfeldes per getText() und "speichert" diesen im Model.
2) Woher weiss die View genau, welcher Wert sich geändert hat?
Die View ist als Listener/Observer am Model registriert.
Ich habe mal zwei Lösungsvarianten skizziert:

Fall 1) View ist Observer und stellt die Methode update(Model o) bereit. Ich habe bei jeder Änderung somit Zugriff auf das komplette Model Objekt. Ist es dann üblich, dass man alle Werte aktualisiert (unsere GUI hat jetzt z.B. 5 JLabel anstatt dem einen oben), auch wenn eigentlich nur ein Wert geändert worden ist?
Oder gibt man dem Objekt mit, welche Werte sich geändert haben z.B. in einem Array, welcher die Elemente hält, welche sich geändert haben?

Vorteil: Nur eine Schnittstelle
Nachteil: Ziemlicher Overhead

Fall 2) View ist ebenfalls Observer und stellt aber anstatt einer update Methode für jedes Feld, was sich ändern kann eine Methode bereit. Zum Beispiel updateLabelInfo(Model o), updateLabelSize(Model o). Das Model ruft dann dementsprechend diese Methode auf und die View weiss dann auch genau, welches Element sich genau ändern muss?

Vorteil: Klare Zuordnung möglich (geringer Overhead)
Nachteil: Ziemlich viel Schnittstellenimplementierung
Fall 3) Die View ist als Observer am Model registriert und implementiert über ein Interface eine update-Methode für alle Werte/Felder. Dieser Methode kann man Informationen darüber mitgeben, was sich geändert hat, so dass die View gezielt die neuen Daten holen kann.
 

Rolli

Mitglied
Und wie soll man an den Inhalt des Textfeldes kommen? Beim Drücken des Buttons holt sich der Controller den Inhalt des Textfeldes per getText() und "speichert" diesen im Model.

Hallo Michael,

danke für die hilfreiche Antwort! Eine Frage habe ich aber noch. Sollte das Model zu jeder Zeit den Inhalt der View gespeichert haben? Sagen wir mal ich habe 3 Eingabefelder. Mit jeweils 3 Buttons darunter. Ich tippe nun in alle 3 Felder etwas ein und drücke den Button unter dem ersten Textfeld. Die Aktion die dann ausgeführt wird soll nur etwas mit dem Inhalt über dem Button zu tun haben. Macht es Sinn dann trotzdem im Model die aktuellen Werte nachzuhalten von den anderen beiden? Oder nur im Bedarfsfall. Ich frage deshalb, weil die View laut MVC ja auch Daten vom Model erfragen kann. Oder sollte sowas besser nur über den Controller laufen?
 

Michael...

Top Contributor
Sollte das Model zu jeder Zeit den Inhalt der View gespeichert haben?
Das Model sollte jederzeit einen konsistent, relevanten Datenzustand gespeichert haben. Werden die Daten in der View editiert, ist das für das Model ersteinmal egal - ausser die Zwischenstände sind ebenfalls relevant, z.B. für Rückgängig oder Wiederholen Aktionen.
Erst wenn der Anwender über die GUI mitteilt (z.B. Buttonclick, Enter, Verlassen des Textfelds), dass die Bearbeitung abgeschlossen ist, werden die Daten ins Model übernommen.
Sagen wir mal ich habe 3 Eingabefelder. Mit jeweils 3 Buttons darunter. Ich tippe nun in alle 3 Felder etwas ein und drücke den Button unter dem ersten Textfeld. Die Aktion die dann ausgeführt wird soll nur etwas mit dem Inhalt über dem Button zu tun haben. Macht es Sinn dann trotzdem im Model die aktuellen Werte nachzuhalten von den anderen beiden?
Ich als Anwender würde jetzt erwarten, dass nur der Inhalt aus dem Textfeld über dem Button ins Model übernommen - also gespeichert - wird. Sonst würde ja ein Button für alle Textfelder ausreichen. Das ist aber eher eine Frage des Designs und der Usability der GUI und hat weniger mit dem MVC zu tun.
Ich frage deshalb, weil die View laut MVC ja auch Daten vom Model erfragen kann. Oder sollte sowas besser nur über den Controller laufen?
Die View besorgt sich die aktuellen Daten immer vom Model.

In dem Fall mit Textfeld, Button und Label in einer GUI ist das vielleicht etwas Overhead und erscheint etwas umständlich, da man nicht unbedingt ein Model benötigt. Aber hier geht es ja darum das MVC umzusetzen.
 

Wildcard

Top Contributor
Schwierg das an simplen Beispielen festzumachen, da bei sehr simplen Beispielen MVC oft gar keinen Sinn macht weil es kein echtes Model gibt.
Wenn du einen realen Use-Case hast würde ich Model-Driven (ob mit, oder ohne MDD Tool Unterstützung) arbeiten. Also zuerst ein Modell überlegen das die benötigten Daten aufnimmt, völlig unabhängig von UI. Die eigentlich Oberfläche kommt dann erst später, damit hast du die Trennung schon automatisch.
Swing verwende ich schon lange nicht mehr, daher weiß ich nicht was dort in letzter Zeit so passiert ist, aber bei anderen Toolkits (SWT/JFace zB) ist der MVC Ansatz eigentlich schon lange ein alter Hut und dort wird massiv auf Databinding gesetzt (impliztes MVC). Halte ich für den deutlich besseren Ansatz.
 

Rolli

Mitglied
Dank euch beiden, Fragen sind soweit geklärt!

EDIT: Eine Frage bleibt nun doch noch... wer kümmert sich denn um die Logik, wenn nicht das Model? Dummes Beispiel: Eingabefeld / Ausgabefeld, oben wird etwas eingegeben und unten wird das ganze komplett in kleinen Buchstaben angezeigt. In größeren Anwendungen steckt da ja sehr viel mehr hinter. Ich würde für dieses Beispiel die Eingabe dem Controller übergeben und dieser delegiert sie weiter an das Model, welches dann eine Funktion bietet, den Text zu "codieren", in einer Variable ablegt und dann die Observer benachrichtigt. Die View aktualisiert dann dementsprechend das zweite Textfeld.

Um das Model vollständig zu kapseln, deklariere ich ein Interface, welches dann unter anderem eine Methode ala
Java:
 public abstract void decodeString();
enhtält. Somit könnte ich es z.B. auch ohne Gui benutzen.

Passt das so in etwa?
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Daher sagt ich: Model First. Eine decodeString Methode sollte nur im Model sein, wenn es für die Domäne Sinn macht, also losgelöst von der Oberfläche.
 

Rolli

Mitglied
Wenn ich das Model so zu erste aufbaue, dann ist es doch vollkommenlosgelöst von der GUI?! Ich könnte doch jetzt genauso gut eine Kommandozeilenapplikation dran hängen und dann das Wort darüber decodieren lassen?!
 

Wildcard

Top Contributor
Wenn ich das Model so zu erste aufbaue, dann ist es doch vollkommenlosgelöst von der GUI?! Ich könnte doch jetzt genauso gut eine Kommandozeilenapplikation dran hängen und dann das Wort darüber decodieren lassen?!

Und genau das ist der Sinn von MVC, das Modell muss völlig losgelöst von der Oberfläche sein und ist normal auch der wichtigste und stabilste Teil deiner Anwendung.
Ich baue Modelle fast ausschließlich mit EMF. Das geht viel schneller als händisch den Code zu schreiben und nur wenige Entwickler sind überhaupt in der Lage derart guten Modellcode zu schreiben.
http://www.eclipse.org/modeling/emf/
 

Rolli

Mitglied
Ich habe mich noch mal an eine SwingApplikation gemacht und verstehe leider immer noch nicht ganz wie es MVC-Konform laufen soll: Beispiel:

Ich möchte ein JTextField mit einem Standard-Wert belegen. Setze ich diesen Wert direkt in der View oder direkt im Konstruktor vom Model, welches dann bei Programmstart die View benachrichtigt und diese dann den Wert übernimmt?

Genau das gleiche Szenario bei Combo Boxen. Ich habe im Moment in der View ein Array mit den Werten der ComboBox und binde dieses auch in der View ein. Sollte man laut MVC das Array in dem Model erstellen und dann bei Start in die View einbinden oder geht das auch so?

Vielen Dank euch schon mal!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Q Designfrage zur JMenuBar AWT, Swing, JavaFX & SWT 6
kaoZ Swing Designfrage AWT, Swing, JavaFX & SWT 21
Z Swing Actions Designfrage AWT, Swing, JavaFX & SWT 2
J Swing JApplet Designfrage AWT, Swing, JavaFX & SWT 4
Y Swing Designfrage (MVC) AWT, Swing, JavaFX & SWT 18
J Designfrage bei rechenintensiver Operation AWT, Swing, JavaFX & SWT 7
M SWT ComboBox mit DB-Inhalten Designfrage AWT, Swing, JavaFX & SWT 5
G designfrage zu 2 panels AWT, Swing, JavaFX & SWT 2
G Designfrage zu Komonenten eines JPanels AWT, Swing, JavaFX & SWT 3
J Allgemeine Designfrage ! AWT, Swing, JavaFX & SWT 3
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
R TableModel und Columnmodel - Zusammenspiel? AWT, Swing, JavaFX & SWT 2
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
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 Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
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
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
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
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
J Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen AWT, Swing, JavaFX & SWT 2
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
D Swing JTable Model View Problem AWT, Swing, JavaFX & SWT 6
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
M Swing Model an View binden AWT, Swing, JavaFX & SWT 4
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
K JSpinner - Model <-> View, unterschiedliche Werte AWT, Swing, JavaFX & SWT 9
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
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
J JTable / Model Daten verändern AWT, Swing, JavaFX & SWT 5
C Model View Controller - Beispielimplementation 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
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
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

Ähnliche Java Themen

Neue Themen


Oben