mvc-Modell: wenn views voneinander wissen sollen

davidh38

Bekanntes Mitglied
Ich löse das Problem, dass Views voneinander wissen, indem ich getter funktion für die viewlist im controller implementiere. Ist das ein guter Weg?
 

Marco13

Top Contributor
Beschreib' ggf. mal genauer, wie dieses "wissen" aussehen soll (was genau sollen sie voneinander kennen?). Sofern das nicht über eine Eigenschaft des Modells passiert, würde es vermutlich vom Controller geregelt werden. Eventuell (!!!) wird dieses Wissen schon über eines der Modelle im GUI abgebildet (z.B. über ein ListModel oder SelectionModel oder ButtonModel bei Swing) - andernfalls könnte (!) man dieses "Wissen" dann wieder über ein Interface rausfaktorisieren, plakativ gesagt sowas wie
Code:
interface ViewKnowledge
{
    void doSomething();
}
class ViewA implements ViewKnowledge {}

ViewA viewA = new ViewA();
ViewB viewB = new ViewB();
viewB.setViewKnowledge(viewA);
Aber das ist so nur ein verschwommenes Bild in der Kristallkugel.
 

davidh38

Bekanntes Mitglied
Beschreib' ggf. mal genauer, wie dieses "wissen" aussehen soll (was genau sollen sie voneinander kennen?). Sofern das nicht über eine Eigenschaft des Modells passiert, würde es vermutlich vom Controller geregelt werden. Eventuell (!!!) wird dieses Wissen schon über eines der Modelle im GUI abgebildet (z.B. über ein ListModel oder SelectionModel oder ButtonModel bei Swing) - andernfalls könnte (!) man dieses "Wissen" dann wieder über ein Interface rausfaktorisieren, plakativ gesagt sowas wie
Code:
interface ViewKnowledge
{
    void doSomething();
}
class ViewA implements ViewKnowledge {}

ViewA viewA = new ViewA();
ViewB viewB = new ViewB();
viewB.setViewKnowledge(viewA);
Aber das ist so nur ein verschwommenes Bild in der Kristallkugel.

Das eine Fenster soll in Abhängigkeit von dem anderen Fenster platziert werden. Wäre deine Lösung dann die beste?
 

Marco13

Top Contributor
Wäre deine Lösung dann die beste?

Das weiß ich nicht, und wer meint, das beurteilen zu können (bzw. zu wissen glaubt) möge sich bitte bei mir melden.

Bisher klingt es schon, als wäre es genug Abstraktion, wenn man dort ein "Window" übergibt, sofern man das Platzieren des einen (oder mehrerer???) Fenster nicht von einer eigenen Klasse übernehmen lassen wollte, die quasi ein "LayoutManager für Fenster" ist. Letzteres klingt IMHO allgemeiner und besser, aber ist auch nur geraten, solange du nicht genauer sagst, was du vorhast.
 

davidh38

Bekanntes Mitglied
Das weiß ich nicht, und wer meint, das beurteilen zu können (bzw. zu wissen glaubt) möge sich bitte bei mir melden.

Bisher klingt es schon, als wäre es genug Abstraktion, wenn man dort ein "Window" übergibt, sofern man das Platzieren des einen (oder mehrerer???) Fenster nicht von einer eigenen Klasse übernehmen lassen wollte, die quasi ein "LayoutManager für Fenster" ist. Letzteres klingt IMHO allgemeiner und besser, aber ist auch nur geraten, solange du nicht genauer sagst, was du vorhast.

Also ich habe ein Hauptfenster und ein Loginwindow. Das Hauptfenster wird in Abhängigkeit von der Auflösung platziert und das Loginwindow in Abhängigkeit von dem Hauptfenster. Jetzt ist die Frage, wie weiß das Loginwindow, wo sich das Hauptfenster befindet. Genau diese Information befindet sich in der "Hauptview" und an die muss das Loginwindow rankommen. Ist die Beschreibung präzise genug? Danke für deine Mühen bis jetzt!
 

faetzminator

Gesperrter Benutzer
Der Ersteller des Loginwindow kann doch einfach die Position setzen, da dieser eigentlich auch das andere Fenster kennen sollte. Wie hast du das implementiert?
 

Michael...

Top Contributor
Ich sehe da jetzt nicht unbedingt einen direkten Bezug zum MVC.
Und warum sollte der Controller von einem Loginwindow (falls nicht schon so umgesetzt sollte dafür JDialog verwendet werden) wissen? Ob die Anmeldung über einen zusätzlichen Dialog oder direkt im Hauptfenster passiert sollte dem Controller und allen anderen Beteiligten völlig egal sein.

Ich würde da eher so vorgehen:
- View öffnet sich, sobald eine Aktion einen User bzw. einen angemeldeten User erfordet. "Meldet" der Controller der View, das eine Authentifizierung notwendig ist.
- View erstellt bzw. öffnet einen modalen Logindialog (Hinweis mit setLocationRelativeTo(...) kann man Fenster zentriert zu anderen Komponenten platzieren)
- Nach Eingabe der Nutzerdaten gibt die View diese an den Controller und schließt bei erfolgreicher Anmeldung den Dialog.

Natürlich kann man auch den Anwender unmittelbar nach Öffnen der View zur Authentifizierung auffordern - ist vermutlich einfacher umzusetzen.
Aber wie gesagt, der LoginDialog ist m.M ein View internes "Problem"
 

Marco13

Top Contributor
Ist das Loginwindow nicht ohnehin ein (modaler?) Dialog mit einem "parent"? Man würde es einfach relativ zum parent platzieren, da braucht's gar keine ausgefeilten Tricks...
 

Spin

Top Contributor
Ich habe mich jetzt sehr viel mit MVC beschäftigt und es gibt für Client basierte Anwendungen leider kein Kochrezept.

Soll jedoch eine Webanwendung mit Servlets programmiert gibt es genug gute und erforlgreiche MVC Konzepte. + HMVC für Module.

Persönlich finde ich es nicht schlimm, das jede GUI jede kennt. Das ist nach MVC erlaubt und sollte von Situation zu Situation selbst entschieden werden. Sicher braucht kein Login Fenster von einem Spiel Fenster oder Anderem Fenster wissen.

Interessanter ist das Handling der Controller und das Zusammenspiel mit anderen Patterns. (Observer)
Eine gute Anwendung in MVC ermöglicht die komplette GUI auszutauschen und das geht nur wenn man die Controller Logik kapselt und das in Listener. Diese kann man ohne Probleme einer anderen GUI hinzufügen. Ob die Views sich nun kennen oder nicht, hat mit MVC nichts zu tun, sondern mit der internen Semantik, ob das nach Ansicht des Betrachters Sinnvoll ist.


Siehe den anderen Beiträgen.

grüße spin
 

davidh38

Bekanntes Mitglied
Ich habe mich jetzt sehr viel mit MVC beschäftigt und es gibt für Client basierte Anwendungen leider kein Kochrezept.

Soll jedoch eine Webanwendung mit Servlets programmiert gibt es genug gute und erforlgreiche MVC Konzepte. + HMVC für Module.

Persönlich finde ich es nicht schlimm, das jede GUI jede kennt. Das ist nach MVC erlaubt und sollte von Situation zu Situation selbst entschieden werden. Sicher braucht kein Login Fenster von einem Spiel Fenster oder Anderem Fenster wissen.

Interessanter ist das Handling der Controller und das Zusammenspiel mit anderen Patterns. (Observer)
Eine gute Anwendung in MVC ermöglicht die komplette GUI auszutauschen und das geht nur wenn man die Controller Logik kapselt und das in Listener. Diese kann man ohne Probleme einer anderen GUI hinzufügen. Ob die Views sich nun kennen oder nicht, hat mit MVC nichts zu tun, sondern mit der internen Semantik, ob das nach Ansicht des Betrachters Sinnvoll ist.


Siehe den anderen Beiträgen.

grüße spin

Hallo Spin, danke für deine Antwort.
wenn du dich lange mit MVC beschäftigt hast, würde ich dich gern eine neue Frage stellen. Unzwar habe ich folgendes Problem

Ich habe ein Fenster, was den JPanel erweitert. Jetzt sind aber alle meine Views Erweiterungen von einer Klasse, die AbstractView heißt. Wie kann ich dafür sorgen, dass mein erweiterter Jpanel trotzdem von AbstractView erbt?

Meine zweite Frage wäre, ob du das mvc-Beispiel von der oraclehomepage kennst:
Java SE Application Design With MVC
und ob du weißt, ob das Observerpattern hier implementiert ist.
 

Michael...

Top Contributor
Ich habe ein Fenster, was den JPanel erweitert. Jetzt sind aber alle meine Views Erweiterungen von einer Klasse, die AbstractView heißt. Wie kann ich dafür sorgen, dass mein erweiterter Jpanel trotzdem von AbstractView erbt?

Meine zweite Frage wäre, ob du das mvc-Beispiel von der oraclehomepage kennst:
Java SE Application Design With MVC
und ob du weißt, ob das Observerpattern hier implementiert ist.
In Java gibt es keine Mehrfachvererbung. Wenn Deine Klasse von AbstractView erben soll, könnte man ein JPanel als Instanzvariable, müsste aber entsprechende Methoden bereitstellen, damit man von aussen an das Panel kommt. Flexibler wäre man da mit einem ViewInterface.

Das Oracle Beispiel verwendet hier PropertyChangeListener als Nachrichtenschnittstelle zwischen den Komponenten. Was m.M. sehr abstrakt ist und für den Einstieg in MVC eventuell zu komplex. Ich würde hier eigene ListenerInterfaces verwenden, die etwas konkreter sind.

Noch ein Hinweis: View entspricht nicht unbedingt GUI.
 

davidh38

Bekanntes Mitglied
In Java gibt es keine Mehrfachvererbung. Wenn Deine Klasse von AbstractView erben soll, könnte man ein JPanel als Instanzvariable, müsste aber entsprechende Methoden bereitstellen, damit man von aussen an das Panel kommt. Flexibler wäre man da mit einem ViewInterface.

Das Oracle Beispiel verwendet hier PropertyChangeListener als Nachrichtenschnittstelle zwischen den Komponenten. Was m.M. sehr abstrakt ist und für den Einstieg in MVC eventuell zu komplex. Ich würde hier eigene ListenerInterfaces verwenden, die etwas konkreter sind.

Noch ein Hinweis: View entspricht nicht unbedingt GUI.


Danke für deine Antwort, was bedeutet denn "View entspricht nicht unbedingt GUI"? Was kann eine View noch sein?
 

Spin

Top Contributor
Hallo,


deine Konsole kann doch auch Output anzeigen oder nicht ? ;)
In meinem letzten Projekt ist das Backend komplett in Java geschrieben und die Controller auch. Zudem wurd eine Flash-Client drauf gepackt. Da alles im MVC realisiert wurde, können wir ohne Probleme den Flash Client durch eine Java GUI wechseln.


Zu deiner Frage :
Es wurde schon gesagt, das Java keine Mehrfachvererbung bereit stellt, das muss es auch nicht ;)

Wenn deine AbstractView eine abstracte Klasse ist und diese vererbt wird an deine anderen Klassen, dann lass deine AbstractView von JPanel erben und deine anderen Klassen haben auch die Eigenschaften von JPanel.


Java:
public class MyView extends AbstractView {

}

public class AbstractView extends JPanel {

}

Was macht deine AbstractView überhaupt? Hat sie irgendeinen semantischen Hintergrund? Oder dient es lediglich für Struktur ?

Poste mal deine AbstractView ....Ich schätze das ein Interface auch funktioniert, außer du hast so viel Code der in jeder View gleich ist.

Zeig mal her jetzt :p:bae:

grüße spin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L ER-Modell Relationen Allgemeine Java-Themen 2
G Polygom Modell aus Punktewolke Allgemeine Java-Themen 15
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
E EMF Ecore Modell. Referenzen nach außen. Allgemeine Java-Themen 2
D JMenu im MVC Modell unterbringen Allgemeine Java-Themen 3
D MVC Modell Allgemeine Java-Themen 8
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
A Frage zum TCP/IP Modell Allgemeine Java-Themen 5
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
berserkerdq2 Habe ein svg bild, kann ich das zu svg koordinaten umrechnen, damit ich den Umriss zeichnen kann? Wenn ja wie? Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
I OpenPDF erzeugt riesige PDFs, wenn Grafiken über PdfGraphics2D#drawImage gezeichnet werden Allgemeine Java-Themen 1
Viper13125 Eclipse Hängt sich auf, wenn ich SimpelDateFormat drin lasse Allgemeine Java-Themen 2
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
P Summieren wenn Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
D Cursor unsichtbar, wenn Kontextmenü aufgerufen wird Allgemeine Java-Themen 5
E JavaFX RMI extrem langsam wenn Server nicht läuft Allgemeine Java-Themen 5
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
J Jasper ireport - wieso beendet die Anwendung wenn ich die Preview schließe Allgemeine Java-Themen 1
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
S Wenn mehr als die Hälfte Großgeschrieben ist. Allgemeine Java-Themen 2
D mouseWheelMoved => erst reagieren, wenn für 1s das Mausrad nicht mehr benutzt wurde Allgemeine Java-Themen 4
L SetBounds wird vor dem Konstruktorcode aufgerufen - Wenn Startleiste links Allgemeine Java-Themen 1
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
DStrohma Input/Output KeyEvent nur verarbeiten wenn es ein "sichtbares" Zeichen ist? Allgemeine Java-Themen 1
S ExecutorService.invokeAll -- was passiert wenn einige Tasks schon ausgefuehrt wurden? Allgemeine Java-Themen 2
M CapsLock abfragen wenn Fenster wieder aktiviert wird Allgemeine Java-Themen 5
D Java Skript Wenn Dann in PDF Formular Allgemeine Java-Themen 2
G Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird Allgemeine Java-Themen 3
L Input/Output Dateien erstellen, wenn ein JAR ausgeführt wird Allgemeine Java-Themen 13
S Strings gehen "kaputt" wenn ich in CVS ein und wieder auschecke. Allgemeine Java-Themen 2
E externen Prozess schließen, wenn Programm geschlossen wird Allgemeine Java-Themen 2
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
B Benachrichtigung, wenn sich Benutzer am Betriebssystem anmeldet Allgemeine Java-Themen 9
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
N OutOfMemory nur wenn -Xmx gesetzt ist?! Allgemeine Java-Themen 6
Y Erfassen der Gesamtbreite, wenn 2 Bildschirme zur Verfügung. Allgemeine Java-Themen 3
V Was tun, wenn close() fehlschlägt? Allgemeine Java-Themen 3
G Was ist Ant und warum soll ich das brachen, wenn es IDEs gib Allgemeine Java-Themen 10
J Probleme wenn man keine serialVersionUID definiert? Allgemeine Java-Themen 27
G Aufruf einer Methode wenn Klasse noch nicht existiert Allgemeine Java-Themen 3
K FarbeA die moeglichst sichtbar ist wenn gezeichnetauf FarbeB Allgemeine Java-Themen 7
G wenn Button geklickt -> regelmäßig Aktion ausführen Allgemeine Java-Themen 7
ARadauer mit keylistener hören auch wenn frame nicht den focus hat Allgemeine Java-Themen 2
S Zweiten Thread erst starten wenn erster Thread beendet ist ? Allgemeine Java-Themen 6
B Datei erst öffnen, wenn EOF gesetzt ? Allgemeine Java-Themen 4
M PostgreSQL - nennenswerte Vorteile und wenn ja, wo? Allgemeine Java-Themen 3
P JTextField textfarbe schwarz auch wenn JTF deaktiviert ist Allgemeine Java-Themen 4
C Wenn long int zu klein Allgemeine Java-Themen 17
F CPU auslastung wenn Speicher mit -Xmx erhöht Allgemeine Java-Themen 4
M Wenn immer nur einer darf . Allgemeine Java-Themen 3
P Ist das möglich mit Java - wenn Nein wie sonst? Allgemeine Java-Themen 8
R Wenn Variable = wat ist Allgemeine Java-Themen 7
J RegEx: "wenn zeichen folgen ersetze x mit y, sonst mit Allgemeine Java-Themen 2
F Wenn ihr Performance wollt nehmt C++ Allgemeine Java-Themen 39
L Wenn String matches [-.,;:_°&] dann. Allgemeine Java-Themen 5
I JMF - feststellen wenn mp3 aus Allgemeine Java-Themen 10
G Prozess beenden, wenn er hängt Allgemeine Java-Themen 9
L JTable: Wenn Zeile markiert dann Meldung. geht nicht Allgemeine Java-Themen 4
G wenn ohne Interface Allgemeine Java-Themen 2
K Wenn events auftritt fireActionPerformed Allgemeine Java-Themen 6
T ^Wenn Java startet wird das Bild unscharf Allgemeine Java-Themen 8
G Wenn JAVA Applet nicht geladen werden kann -> Flash Allgemeine Java-Themen 4
B Rechner stürzt ab wenn Java-Anwendungen geöffnet werden! Allgemeine Java-Themen 2
N Wenn Bild nicht vorhanden, dann Weiterleitung Allgemeine Java-Themen 5
G Auf KeyEvent reagieren, wenn das Fenster nicht aktiv ist Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben