MVC Verständnisfrage

Hallo,

habe ein Progrämmchen mittels MVC programmiert, wobei hier erstmal nur die “View”(V) und die "Control"©
interessiert.
Ich habs so gemacht die “C” instanziert die “V”, diese wiederum stellt eine Methode für den Listener bereit und die “C” stellt eine interne Klasse für den ActionPerformed(…) zur Verf.
soweit so gut funktioniert auch alles wie es soll.

Jetzt möchte ich aber einige identisch bestückte Panels zu der “V” hinzufügen (Instanzen einer Klasse)
mittels add auch das funktioniert bestens.

Auszug der “View”

//.
panel1 = new MakeGui01(String name1);
panel2 = new MakeGui01(String name2);
panel3 = new MakeGui01(String name3);
//.

Auszug der “UnterView” (MakeGui01)

public class MakeGui01 extends JPanel
{
JPanel panel3 = new JPanel (new BorderLayout());
//..
//..
//jetzt jede Menge Buttons und Label auf diesem Panel
//.
//.
add (panel3);
}

Nur, wie handle ich jetzt die Events der Elemente (hier Buttons auf dem panel3)??
Die “C” kennt die Instanzen der “UnterView” ja nicht

hoffentlich versteht mich einer

danke
Gruß Gü

du könntest für MakeGui01 auch einen eigenen Controler schreiben, der nur mit einer bestimmten MakeGui01 verbunden ist. Und für jede Instanz von MakeGui01 gibt es eine eigenständige Instanz von dem Controller

d.h. die “V” erstellt ein MakeGui01 sowie eine Controller Instanz und eine Mitteilung über den “echten” Controller
der echte “Controller” bekommt dann die Instanzen der “Untercontroller”?

“C” sollte die Subcontroller-Instanzen zu MakeGui01 erzeugen und halten. Die Subcontroller erzeugen ihre View-Objekte (MakeGui01). Zur Verbindung von Haupt- und Subview könnte der Hauptcontroller die Subviews bei seinen Subcontrollern anfordern.

ja vielen Danke
das klingt logisch.

dann mache ich mir mal Gedanken wie ich es schaffe die (MakeGui01) zur View zu adden,
da habe ich noch keinen Plan (innerhalb der View gings ja)

Gruß Gü

ich instanziere zuert die makegui01 und dann die Viev und übergebe die instanzen der makeguis, dann müßte esklappen wievorher oder?

Der Haupt-Controller könnte bei seiner Initialisierung seinen Haupt-View erzeugen und dabei alle GUI-Elemente initialisieren, die nur direkt dem Haupt-View zugeordnet sind. Anschließend könnte der Haupt-Controller alle Sub-Controller initialisieren lassen. Die Sub-Controller erzeugen bei ihrer Initialisierung ihre eigenen View-Objekte (MakeGUI01). Bei deren Initialisierung werden auch hier alle GUI-Elemente der Sub-View erzeugt.

Am Ende der Initialisierung des Hauptcontrollers sind also alle GUI-Elemente und Controller initialisiert wobei die Steuerung der View-Initialisierung vom jeweiligs zuständigen Controller vorgenommen wurde.

Im Anschluss daran, schnappt sich der Haupt-Controller die Sub-Views über eine von der Sub-Controller-Klasse bereitgestellte Methode und übergibt sie seinem Haupt-View zur Einbindung.

Ja danke schön!
alles eingebaut und funktioniert!!

vielleicht noch eine Frage am Rande, mittelfristig soll die View als Client irgendwo extern z.B. anderer PC laufen.

jetzt gibt es aber dort zwei drei Felder die die Eingabe lokal prüfen sollen (extern ja kein Problem).
D.h. für diese Felder wäre der Listener ja Lokal
nach einem positiven Test müssen die Daten dann ja doch zumController gesendet werden, wie geht das denn jetzt?
ich würde einfach eine set methode im Controller einbauen, ist das ok so?

Ich bin mir nicht sicher was du da hast aber nach MVC sieht mir das nicht aus. Ist aber auch zu wenig Code da um irgendwelche vernünftigen Aussagen zu treffen. Nur mal soviel: In MVC stellt kann es gut und gerne mehrere Controller geben, das sind die Listener. Der Controller ist in erster Linie dafür zuständig Benutzerinteraktionen oder von der View zum Model weiterzuleiten. Die Praxis Controller instanziert View und Model macht die Sache mMn nur unübersichtlich und nicht flexibel.

[QUOTE=mugsaway]Ja danke schön!
alles eingebaut und funktioniert!!

vielleicht noch eine Frage am Rande, mittelfristig soll die View als Client irgendwo extern z.B. anderer PC laufen.

jetzt gibt es aber dort zwei drei Felder die die Eingabe lokal prüfen sollen (extern ja kein Problem).
D.h. für diese Felder wäre der Listener ja Lokal
nach einem positiven Test müssen die Daten dann ja doch zumController gesendet werden, wie geht das denn jetzt?
ich würde einfach eine set methode im Controller einbauen, ist das ok so?[/QUOTE]

Wie soll denn die Kommunikation zwischen View und Controller stattfinden, falls der View Remote läuft?

web Server, Client

Ok. Das dürfte aufwändig werden, da du eine Transportschicht für die Daten und die GUI-Synchronisation erstellen musst.

Als MVC-Variante könntest du dir hier besser MVVM ansehen. ViewModel läuft auf dem Server, View auf dem Client. Dazwischen ist die Transportschicht.

Tja da bin ich mir auch noch nicht absolut im klaren drüber, weil im prinzip probiere ich im moment einige sachen aus, so als gerüst.

im1. schritt werde ich wohl einem linux pc als server laufen lassen und dann mit einem browser den server anwählen
wie ich dann die VIEW auf den PC implementiere als servlet, applet, oder html oder sonstwie, weiß ich noch nicht.
wie aber auch immer soll (zumindest dort wo es bekannt ist) die Eingabefelder auf mögliche Fehler früh abgefangen werden. Es macht m.E. nicht wirklich Sinn das der Server (Model, Controller) dann die Eingaben auf Korrektheit überprüft, wenn das die View selbest schon könnte.
der Controller muß auf dem Server laufen.

Gruß gü

Hast du irgendeine Art von Diagramm für deine Architektur gemacht, z.B ein Komponentendiagramm?

leider noch nicht ich bin im moment noch in dr schmierzettelphase und probiere
Sachen aus, die für (mein) Verständnis wichtig sind
ich neige dazu immer wieder in die prozedurale denkweise abzugleiten (weil ich das Jahrelang gemacht habe)
Vor zig Jahren als von MVC noch keine Rede war hatte ich mal eine IBM SNA Anwendung simuliert
die IBM schickte immer einen Datensatz der dann auf einem IBM Terminal (Kosten > 10.00DM)dargestellt wurde. Ich habe die mal so simuliert, das man die Daten auch auf einem einfachen (dummen) Terminal (Kosten < 500DM)darstellen konnte.
das war exakt das gleiche Prinzip Daten und Ansicht trennen.
Da war es sehr wichtig eine 100%ige Trennung vorzunehmen(MVC hätte da 100%ig drauf gepasst)
Nach wie vor bin ich aber der Ansicht, das man nicht alles immer 100%ig machen kann.
was ist z.B. wenn man von irgendeinem Server ein Formular anfordert und dann beim wegsenden erst der Server prüft, ob die Eingabe ok wäre, für meinen Geschmack könnte zusätzlich zum Formular noch einige Bytes gesendet werden die der Client (View) als Referenztest nutzen kann.

gruß gü

[QUOTE=mugsaway]Tja da bin ich mir auch noch nicht absolut im klaren drüber, weil im prinzip probiere ich im moment einige sachen aus, so als gerüst.

im1. schritt werde ich wohl einem linux pc als server laufen lassen und dann mit einem browser den server anwählen
wie ich dann die VIEW auf den PC implementiere als servlet, applet, oder html oder sonstwie, weiß ich noch nicht.
wie aber auch immer soll (zumindest dort wo es bekannt ist) die Eingabefelder auf mögliche Fehler früh abgefangen werden. Es macht m.E. nicht wirklich Sinn das der Server (Model, Controller) dann die Eingaben auf Korrektheit überprüft, wenn das die View selbest schon könnte.
der Controller muß auf dem Server laufen.

Gruß gü[/QUOTE]

Eine syntaktische Validierung kann durchaus auf dem Client geschehen. Die meisten Feldkomponenten sehen dafür Möglichkeiten vor. Fachliche Validierung sollte auf dem Server durchgeführt werden.

Bevor du ein Entwurfsmuster im Detail planst, solltest du dir Gedanken über deine Gesamtarchitektur machen. Eine gründliche Anforderungsermittlung ist für eine gute Entscheidungsgrundlage unerlässlich.

Einige Rahmenbedingung hast du schon genannt: View auf dem Client, Controller auf dem Server, Oberflächentechnologie egal. Hier könntest du dir mal Vaadin ansehen. https://vaadin.com/home

Damit könntest du im Prinzip MVVM umsetzen. Für die Oberfläche wird GWT verwendet.

danke, das mit dem GWT hatte ich schon mal irgendwo gelesen (eclipse, google…) meine ich
man kann dann glaube ich alles in java programmieren.

Ich denke mal ich mache zuerst das MVC fertig.

übrigens im Nachhinein war das eigentlich klar mit den Controllern das funktioniert perfekt!!
jetzt sind auch alle Controller wieder nebeneinander auf einer Ebene und mit den Instanzen ist es kein problem
Danke nochmal für den Hinweis!

das war 2Minuten arbeit Die GUI01 in den Controller zu legen.
So schlecht kann dann das programm auch nicht strukturiert sein

leider muß ich gleich weg wollte aber noch das Konzept irgendwie mit Bleistift zu Papier bringen.
Ich melde mich wieder

erst mal schönes WE

Gruß Gü

Man sollte schon MVC für ne Webanwendung und für ne Desktopanwendung unterscheiden, da gibt es schon ein paar andere Ansichten.

Aber sonst würde ich eher für das EventHandling zu einem EventBus greifen. Siehe GWT, Eclipse e4, OSGi usw.

Wenn Du auf der Client-Seite möglichst wenig fachlichen Ballast haben möchtest und trotzdem zeitnah Vorgänge visualisieren musst, dann schau Dir doch mal OpenDolphin an. Da muss man sich auch keine Gedanken um den Transport machen. Funzt mit JavaFX, GWT, Swing…

Hallo nochmal,

habe jetzt die Variante genommen das jede View einen eigenen Controller hat!!
funktionirt bestens!

vielen dank für die Antworten und Anregungen

ich schließe das hier mal, weil ich moment keine probleme habe, spaeter mit deen Wegeschichten kommen bestimmt noch genug Probleme

schönen Sommer

gruß Gü