hiho,
hab ja nu schon ne Menge mitgelesen und nachgelesen und ja auch die FAQ und was es sonst so gibt, trotzdem schoss mir grad folgendes durch den Kopf:
Controller instanziiert seine View, und eventuelle weitere Controller für weitere Views
Ich habe ein MainFrame, darauf kommt ein CardPanel, damit ich die Oberfläche komplett wechseln kann. Auf dem CardPanel liegen auf kompletten Raum Panel, welche dann die jeweilige Ansicht (Buttons, Listen, Tabellen etc.) beinhalten. Nun habe ich gelesen das pro View nen Controller erzeugt werden soll. Sprich ich hätte einen Controller fürs MainFrame (mit Toolbar & Menüs welche über diesen Controller laufen würden?) und pro Panel auf dem CardPanel je einen Controller (welcher für die jeweiligen Ansichten zuständig ist). Wäre das so korrekt?
Theoretisch können in jeder Ansicht, und auch vom Menü aus die Daten verändert werden, sprich die Methoden dazu aufgerufen werde, sodass alle Controller die selben Methoden bereitstellen würden. So gesehen nur andere Ansichten, aber überall die gleichen Manipulationsmöglichkeiten.
Verzicht auf anonyme Klassen für Listener in den Views
Wie ich es mittlerweile verstanden habe und auch schöner finde, würde man die Listener-Implementierungen in den Controllern unterbringen. Sprich anonyme Klassen für Listener in den Views fallen weg.
Die Vielfalt der Datenmanipulation ist eher gering, sagen wir mal maximal 10 Möglichkeiten (sind bestimmt zu viel, Hinzufügen, Löschen Ändern von bestimmten Daten, etc). Auch würde nun die View kein Code mehr beinhalten der zB so aussieht: ... controller.foo() ... . Ich würde lediglich den Komponenten entweder direkt den Controller als Listener anbieten, oder eigenen Listenerklassen, die aber dann mit dem jeweiligen Controller zur View gekoppelt sein müssten.
Wie mach ich es nun am besten diese Listenerimplementierungen mit den Controllern zu koppeln. Gerne würde ich die Listener in extra Klassen unterbringen, der Übersicht halber. Interfaces, welche die Controller implementieren, würden sich weniger anbieten, da der Code in mehreren Controller recht redundant wär. Das die Controller von einem Listener/-SuperListener erben halte ich für weniger praktisch (wegen nicht vorhandener Mehrfachvererbung), aber ich hätte keinen redundanten Code in den Controllerklassen. Irgendwie gehen mir da die Ideen aus ???:L
was mir einfällt wäre folgendes:
aber wie genau da nun was wovon erbt und implementieren muss weiss ich grad nicht. Das wäre die Variante das ich nen eigenen Listener an nen JButton binde, und dabei die jeweilige Controllerklasse in dem Listener parat hätte.
Selbiges müsste dann für Listen, Menüs und sowas alles gehen.
EDIT: ich würde dem Listener im Konstruktor den Controller anbieten, hätte also sowas:
Müsste klappen oder? dann würde ich selbstverständlich den controller in obiger Methode wieder entfernen. Wenns blöd kommt müsste ich da noch schauen wegen Synchronisation, aber wenn das nur von der GUI ausgeht sollte nix nebenläufig manipulieren.
Was mir noch dazu einfällt:
Wenn ich die Listener extern halte, und ich möchte bspw auf Druck eine Buttons einen Text aus nem Textfeld zum Manipulieren der Daten nutzen, dann kennt der Listener keinen Verweis mehr auf die View, und kann somit kein Textfeld auslesen. Ich bräuchte quasi die Möglichkeit vor dem Auslösen der "actionPerformed" des Buttons ein Event zu schnüren was alle Informationen beinhaltet die jemals interessant sein könnten, im Sinne der Datenmanipulation. Dieses Event könnte man per "getLastEvent" aus dem Controller von seiner View anfordern.
Aber: wie könnt ich das performant genug machen, um nich bei jedem eingegeben Buchstaben gleich das Event zu updaten, denn ich weiss ja nie wann der Nutzer auf nen Knopp drückt.
Optimal wäre: Nutzer drückt Button, aber direkt vorm Eintritt in den Listener, schuster ich fix das Event mit allen nötigen Infos zusammen. Klingt für mich aber grad mal nicht machbar.
fireXXX-Methoden für die GUI
Ich muss ja nach erfolgreicher Manipulation der Daten, diese an die GUI weiterreichen. Dazu können das MainFrame und die Panels fürs CardPanel eine Schnittstelle "MyDataListener" oder dergleichen implementieren. Problem hierbei, das der Controller einer View, nur die Listener dieser View informieren kann, aber nicht die der anderen Views.
Kompromiss: Beim Wechsel der Ansichten lade ich die Daten neu, was aber ziemlich hässlich werden könnte bei größeren Datenmengen. ControllerView1 kann quasi keine Listener informieren die nur dem ControllerView2 bekannt sind.
EDIT ENDE
Ähm ja das sind so grad die 3 wesentlichen Punkte die mir einfielen
Sollte was nicht ganz klar sein, was ich gut verstehen kann, dann bitte nachhaken, bzw verbessert mich wenn ich total aufm Holzweg bin
Und wenn ihr nicht gestorben seit, erbitt ich eure Hilfe ^^ ... sry das so viel is :roll:
hab ja nu schon ne Menge mitgelesen und nachgelesen und ja auch die FAQ und was es sonst so gibt, trotzdem schoss mir grad folgendes durch den Kopf:
Controller instanziiert seine View, und eventuelle weitere Controller für weitere Views
Ich habe ein MainFrame, darauf kommt ein CardPanel, damit ich die Oberfläche komplett wechseln kann. Auf dem CardPanel liegen auf kompletten Raum Panel, welche dann die jeweilige Ansicht (Buttons, Listen, Tabellen etc.) beinhalten. Nun habe ich gelesen das pro View nen Controller erzeugt werden soll. Sprich ich hätte einen Controller fürs MainFrame (mit Toolbar & Menüs welche über diesen Controller laufen würden?) und pro Panel auf dem CardPanel je einen Controller (welcher für die jeweiligen Ansichten zuständig ist). Wäre das so korrekt?
Theoretisch können in jeder Ansicht, und auch vom Menü aus die Daten verändert werden, sprich die Methoden dazu aufgerufen werde, sodass alle Controller die selben Methoden bereitstellen würden. So gesehen nur andere Ansichten, aber überall die gleichen Manipulationsmöglichkeiten.
Verzicht auf anonyme Klassen für Listener in den Views
Wie ich es mittlerweile verstanden habe und auch schöner finde, würde man die Listener-Implementierungen in den Controllern unterbringen. Sprich anonyme Klassen für Listener in den Views fallen weg.
Die Vielfalt der Datenmanipulation ist eher gering, sagen wir mal maximal 10 Möglichkeiten (sind bestimmt zu viel, Hinzufügen, Löschen Ändern von bestimmten Daten, etc). Auch würde nun die View kein Code mehr beinhalten der zB so aussieht: ... controller.foo() ... . Ich würde lediglich den Komponenten entweder direkt den Controller als Listener anbieten, oder eigenen Listenerklassen, die aber dann mit dem jeweiligen Controller zur View gekoppelt sein müssten.
Wie mach ich es nun am besten diese Listenerimplementierungen mit den Controllern zu koppeln. Gerne würde ich die Listener in extra Klassen unterbringen, der Übersicht halber. Interfaces, welche die Controller implementieren, würden sich weniger anbieten, da der Code in mehreren Controller recht redundant wär. Das die Controller von einem Listener/-SuperListener erben halte ich für weniger praktisch (wegen nicht vorhandener Mehrfachvererbung), aber ich hätte keinen redundanten Code in den Controllerklassen. Irgendwie gehen mir da die Ideen aus ???:L
was mir einfällt wäre folgendes:
Code:
public class MyListener extends .... implements .... {
public void myActionPerformed(Controller specificViewController, Action e) {
....
specificViewController.foo();
}
}
Selbiges müsste dann für Listen, Menüs und sowas alles gehen.
EDIT: ich würde dem Listener im Konstruktor den Controller anbieten, hätte also sowas:
Code:
fooButton.addListener(new MyListener(this.controller));
Was mir noch dazu einfällt:
Wenn ich die Listener extern halte, und ich möchte bspw auf Druck eine Buttons einen Text aus nem Textfeld zum Manipulieren der Daten nutzen, dann kennt der Listener keinen Verweis mehr auf die View, und kann somit kein Textfeld auslesen. Ich bräuchte quasi die Möglichkeit vor dem Auslösen der "actionPerformed" des Buttons ein Event zu schnüren was alle Informationen beinhaltet die jemals interessant sein könnten, im Sinne der Datenmanipulation. Dieses Event könnte man per "getLastEvent" aus dem Controller von seiner View anfordern.
Aber: wie könnt ich das performant genug machen, um nich bei jedem eingegeben Buchstaben gleich das Event zu updaten, denn ich weiss ja nie wann der Nutzer auf nen Knopp drückt.
Optimal wäre: Nutzer drückt Button, aber direkt vorm Eintritt in den Listener, schuster ich fix das Event mit allen nötigen Infos zusammen. Klingt für mich aber grad mal nicht machbar.
fireXXX-Methoden für die GUI
Ich muss ja nach erfolgreicher Manipulation der Daten, diese an die GUI weiterreichen. Dazu können das MainFrame und die Panels fürs CardPanel eine Schnittstelle "MyDataListener" oder dergleichen implementieren. Problem hierbei, das der Controller einer View, nur die Listener dieser View informieren kann, aber nicht die der anderen Views.
Kompromiss: Beim Wechsel der Ansichten lade ich die Daten neu, was aber ziemlich hässlich werden könnte bei größeren Datenmengen. ControllerView1 kann quasi keine Listener informieren die nur dem ControllerView2 bekannt sind.
EDIT ENDE
Ähm ja das sind so grad die 3 wesentlichen Punkte die mir einfielen
Sollte was nicht ganz klar sein, was ich gut verstehen kann, dann bitte nachhaken, bzw verbessert mich wenn ich total aufm Holzweg bin
Und wenn ihr nicht gestorben seit, erbitt ich eure Hilfe ^^ ... sry das so viel is :roll: