ich plane gerade ein neues Java Projekt welches diesmal ein wenig größer werden soll.
Nun frage ich mich wie ich die Struktur - speziell was die Menus mit deren MenuItems und deren Handlern angeht - aufbaue.
Wie geht Ihr vor, wenn Ihr in euren Programmen PopupMenus z.B. per Rechtsklick und bei Klick auf einen Button und ausserdem noch eine Menubar habt und einige Menuitems sich vllt. sogar gleichen bzw. die selbe Aktion ausführen sollen?
- Schreibt Ihr für jede Aktion einen eigenen Actionhandler und gebt diesen allen Menüpunkten die diese Aktion ausführen kann?
- Schreibt ihr an jedes Menuitem immer addActionListener(new ActionListener(...));?
- Verwaltet Ihr eure Menus in einer Zentralen Klasse wo Ihr wiederrum eines der ersten beiden Punkte angeht?
- Schreibt Ihr für jede Aktion einen eigenen Actionhandler und gebt diesen allen Menüpunkten die diese Aktion ausführen kann?
- Schreibt ihr an jedes Menuitem immer addActionListener(new ActionListener(...));?
Wenn ich allerdings immer an der Stelle wo ich ein Menü brauche mir dieses zusammenbaue, wird doch der code bei entsprechend vielen Menüs recht unübersichtlich oder etwa nicht?
tfa hat gesagt.:
Informiere dich über das Entwurfsmuster "Model-View-Controller" (MVC). Meiner Meinung die einzig sinnvolle Art, GUI-Programme zu strukturieren.
Deswegen bin ich ja aud die Idee gekommen eine Klasse zu schreiben die mir meine Menus mit deren Actions verwaltet und in der GUI diese dann die menüs an die entsprechenden Componenten hängt ...
Wenn ich allerdings immer an der Stelle wo ich ein Menü brauche mir dieses zusammenbaue, wird doch der code bei entsprechend vielen Menüs recht unübersichtlich oder etwa nicht?
Musst nicht sein, wenn man das vernünftig umsetzt. Einen Actionlistener mit 25 if-else-if Fällen finde ich jedenfalls unübersichtlicher. Die zweite Variante hat auch den Vorteil, dass man eine Action leicht an mehrere Menu-Items oder Buttons koppeln kann.
ok, bedeutet wenn du zum beispiel die Aktionen "add", "update" und "delete" sowohl in der Menubar, als auch in verschiedenen Popupmenus haben willst kapselst du diese in extra Klassen und weist diese dann den entsprechenden MenItems zu - im prinzip oder?
Definierst du die Actions dann als static und rufst diese z.B. per getInstance auf oder wie kann man sich das vorstellen?
ok, bedeutet wenn du zum beispiel die Aktionen "add", "update" und "delete" sowohl in der Menubar, als auch in verschiedenen Popupmenus haben willst kapselst du diese in extra Klassen und weist diese dann den entsprechenden MenItems zu - im prinzip oder?
Nein nein, nichts mit static! Die Actions werden vom Controller verwaltet und den View-Klassen zur Verknüpfung mit den entsprechenden Komponenten übergeben. Das sind alles ganz normale Klassen, keine Singletons oder so.
Nein nein, nichts mit static! Die Actions werden vom Controller verwaltet und den View-Klassen zur Verknüpfung mit den entsprechenden Komponenten übergeben. Das sind alles ganz normale Klassen, keine Singletons oder so.
Öhh okay, aber dann würde ja wenn ich zum Beispiel an 3 Stellen die addAction brauche in meinem Programm 3x eine Instanz von eben dieser erzeugt werden. Was wäre falsch daran per Singleton zu arbeiten und so nur eine Instanz zu haben?!
Du hast natürlich nur ein Objekt dieser Add-Action (wenn es an den 3 Stellen immer die selbe sein soll). Eine Controller-Klasse hat dann z.B. die Methode
Code:
public Action getAddAction() {
if (addAction==null) {
addAction = new ....
}
return addAction;
}
Deine drei View-Klassen müssen sich dann eben diese Action aus ein und dem selben Controller-Objekt holen.
Wie du das organisiert, bleibt dir überlassen. Du könntest meinetwegen dem Controller die View-Objekte erzeugen lassen und bei der Gelegenheit gleich die Action mit übergeben. Oder die Views holen sich das was sie brauchen aus dem Controller-Objekt. Platz für Singletons sehe ich hier überhaupt nicht.
Entweder ist heute absolut nicht mein Tag oder ich suche nach dem "Singleton im Heuhaufen" ...
Wenn ich mir einen Controller schreibe, der meine ganzen Actions verwaltet und einzig und allein die Aufgabe hat diese Actions bei Anfrage ggf. zu erzeugen und bei Anfrage zurück zu geben, könnte ich eigtl. diese Methoden static machen um nicht extra ein Objekt für den ActionController zu laden (welcher dann ja z.B. an 3 Stellen im Code geladen werden müsste)
Also hätte ich dann folgende Methode:
Code:
public static Action getAddAction() {
if (addAction==null) {
addAction = new ....
}
return addAction;
}
Wenn ich mich jetzt nicht irre, wäre dies eigtl. genau das selbe als wenn ich die Action gleich als Singleton definiert hätte oder?
Was würde dafür sprechen die methoden im Controller nicht static zu machen?
Theoretisch geht das natürlich auch mit statischen Methoden oder Singletons. Wenn du damit glücklich wirst und alles funktioniert, wird keiner was dagegen haben.
Aber einige Sachen funktionieren so einfach nicht, z.B. Interfaces, Vererbung, viele nützliche Entwurfsmuster.
Ich habe beispielsweise viele Controller, die in einer Hierarchie stehen. Ein Haupt-Controller kann viele Unter-Controller besitzten (für Sub-Views), und einen Parent-Controller. Mit einer rein statischen Lösung ist das schwer zu realsieren.
Verwandte Controller können von einer gemeinsam Oberklasse abgeleitet sein oder spezielle Interfaces implementieren. Statisch geht sowas nicht. Das ist aber wie gesagt ein größeres Projekt. Für kleine Sachen wäre das vielleicht Overkill. Aber dein Programm wächst ja möglicherweise auch noch...