Aufbau einer komplexen GUI

Status
Nicht offen für weitere Antworten.

tobe77

Mitglied
Hallo,

wie würdet Ihr eine komplexe Swing GUI aufbauen ?
Welches Design Pattern würdet ihr verwenden?

Gruss Thomas
 

Wildcard

Top Contributor
Design Pattern? Auf ein bestimmtes Problem passen oft ein oder mehrere Design Patterns. Du hast kein Problem genannt, also passt auch kein Pattern.
 

tobe77

Mitglied
Probleme gibs ja auch nicht. Ich wollte es halt ja nur mal wissen. Ich verwende meist einen Controller und mehrere Views
 

Wildcard

Top Contributor
Sprich: du verwendest MVC? Das ist recht üblich, fast schon standard, allerdings kein Design Pattern.
 

KSG9|sebastian

Top Contributor
Für komplexe Anwendungen schreibe ich meist ein kleines "Framework" welches die arbeit erleichtert.
Allgemein unterstützt das Framework Funktionen wie
- Data-Binding
- Trennung der Anwendung in verschiedene Module
- Transparente Kommunikation Client/Server (wenn nötig)
- "Helfer" für div Dinge wie Persistierung, Layout u.s.w.

Klassisches MVC ist imho zu wenig für eine größere Anwendung...
 

slawaweis

Bekanntes Mitglied
wie würdet Ihr eine komplexe Swing GUI aufbauen ?
Welches Design Pattern würdet ihr verwenden?
ich entwickle seit ein paar Jahren eine recht komplexe GUI mit Swing und habe dabei einiges an Erfahrung gesammelt. Mein erster großer Fehler war es die Daten, also die Inhalte und die Logik, zu sehr mit der GUI zu verdrahten, das sollte man auf keinen Fall machen. Mehrere Zwischenschichten sind ein Muss. Ein anderes großes Problem ist der sehr schnelle Verschleiß der GUI. Mit der Zeit kommen immer neue Java-Versionen mit neuen Sachen raus und die Anforderungen ändern sich ständig. Deshalb wird die GUI ständig umgeschrieben.

Daraus habe ich ein paar Erkenntnisse abgeleitet:

1. Man sollte die GUI von dem restlichen Programm komplett und strikt trennen. Zu einer komplexen GUI gehört ein noch komplexeres Programm welches die Logik und die Daten repräsentiert. Deshalb sollte man, bevor man eine einzige Zeile UI-Code schreibt, sich eine Zwischenschicht überlegen, was den die GUI leisten soll. Das könnte so aussehen:

[highlight="java"]
public interface IMyUI
{
public void buildUI() throws (Irgendeine)Exception;
public void destroyUI() throws (Irgendeine)Exception;

public void showUI(boolean visible);
public void showView(EViewType type, Object param); // EViewType ist ein Enum mit allen möglichen Anzeigearten
public void showData(MyData data);
public void showMessage(EMessageType type, String message);

public void addListener(MyListener l);
public void removeListener(MyListener l);

// weitere Funktionen ...

}
[/highlight]

Diese Zwischenschicht sollte nur die Sachen haben, die man für sein Programm braucht. Hier sollten keine Swing oder AWT Elemente auftauchen. Überall außerhalb des GUI-Parts sollte man nur IMyUI verwenden und java.awt.* und javax.swing.* erst gar nicht zulassen. Das impliziert natürlich, dass man auch eigene Events und Listener definiert und wenn Threads ins Spiel kommen, auch eine eigene Synchronisationsverwaltung schreibt. Es ist ein Aufwand diese Zwischenschicht umzusetzen, aber so zwingt man sich zu überlegen, was man wirklich braucht und ist nicht von den vielen AWT oder Swing Funktionen geblendet. Das Interface IMyUI kann auch ruhig 50 oder 100 Funktionen enthalten, wobei man das mit Subinterfaces lösen kann. Das wichtigste ist eine saubere Trennung.

Ein weiterer Vorteil von so einer strikten Trennung ist, dass man parallel (z.B. von zwei verschiedenen Teams) eine GUI in Swing und eine in SWT umsetzen kann, um zu sehen, was einem besser gefällt. Genau das versuche ich gerade mit meinem Projekt hinzukriegen. Weiterhin kann man mit dem selben Interface, oder einer Erweiterung IMyUI2, schon die GUI 2.0 implementieren, während 1.0 noch produktiv eingesetzt wird.

2. Wenn man eine komplexe GUI will, sollte man diese großenteils wie ein Framework organisieren. Man kann sich ruhig an Swing orientieren. Mit der Zeit ändert sich die GUI recht schnell und auch Java bringt immer wieder neue Sachen mit. So ist das MVC-Konzept Pflicht. Daten immer von der Darstellung trennen. Am besten von keinen Komponenten ableiten, außer man muss paintComponent() überschreiben. Für JTree, JTable oder JList immer eigene Datenmodelle, CellRenderer und EventListener entwickeln, anstatt die Klassen zu überschreiben. Bevor man eigene Komponenten entwickelt sollte man im Internet schauen, ob es die nicht schon fertig gibt, wie z.B. SwingX oder JIDE. Eigene komplexe Komponenten zu schreiben und zu warten ist sehr aufwändig. Ich hatte mal JSpinner selber umgesetzt, bevor es das im JDK gab. Ich glaube, es ist bis Heute nicht fehlerfrei geworden.

3. Genau wie bei Punkt 1 kann man auch die eigenen Darstellungskomponenten komplett abstrakt machen. Hat man z.B. in seinem Programm 3 verschiedene Baum-Darstellungen, so sollte man dafür zuerst 3 Interfaces definieren:

[highlight="java"]
public interface IMyTreeViewDataType01
{
showData(MyDataType01 data);
}

public interface IMyTreeViewDataType02
{
showData(MyDataType02 data);
}

public interface IMyTreeViewDataType03
{
showData(MyDataType03 data);
}

[/highlight]

und danach die realen Komponenten umsetzen. Kann sein, dass am Ende eine einzige Klasse alle diese Interfaces bedient, es können aber auch 10 werden. Wieder haben wir hier den Vorteil, dass man die Version 2.0 oder 3.0 der Komponenten entwickeln und testen kann, ohne das Programm großartig ändern zu müssen.

4. Man sollte nicht zu schlau mit dem Interfacedesign sein. Manchmal reizt es einen, eine komplett einzigartige GUI zu machen, die es so noch nie gab. Da sollte man besondere Vorsicht walten lassen. Die meisten User lehnen neue Sachen ab, weil sie diese nicht verstehen und nicht benutzen können. Ein Beispiel wären z.B. die Ribbons, die Microsoft eingeführt hat. Es wurde mit gespaltener Meinung aufgenommen. Deshalb sollte man sich am besten an das gängige halten, was die meisten User ohne das Handbuch zu lesen sofort erkennen und verwenden können. Neue Sachen oder Interfacearten sollte man in Ruhe mit der Zielgruppe austesten und langsam einführen, damit die User Zeit haben sich daran zu gewöhnen.

5. Das PLAF (Pluggable look and feel) sollte man nicht außer Sicht lassen. Irgendwann will man seine Anwendung in verschiedenen Styles sehen und es gibt auch einige wirklich gute, wie Substance. Deshalb sollte man sehr sparsam mit setFont, setBackground/Foreground, setOpaque oder setBorder umgehen. Am besten integriert man schon von Anfang an ein paar gute PLAFs in sein Programm, zwischen denen man hin und her schaltet. So kann auch der eine oder andere böser Schnitzer erkannt werden, wenn die GUI mit einem anderen PLAF plötzlich kaputt ist.

Eine weitere Herausforderung im Zusammenhang mit dem PLAF sind die Icons. Am besten legt man diese von Anfang an als Vektorgrafik aus, damit man diese dynamisch dem PLAF anpassen kann.

6. Auch wenn die meisten User eine GUI mit der Maus benutzen, sollte man doch von Anfang an so programmieren, dass die ganze GUI komplett mit der Tastatur steuerbar ist. Einerseits ist es guter Programmierstill und sorgt für ein durchgedachtes Design, andererseits benutzen User bei bestimmten Sachen, die z.B. oft wiederholt werden, Tastaturabkürzungen, um einfach schneller zu arbeiten. Niemand wird vielleicht am Ende komplett ohne Maus arbeiten, aber jeder wird seinen Bereich haben, den er am liebsten mit der Tastatur bedient.

7. I18N und L10N! Wenn man sein Programm später in mehreren Sprachen rausbringen will, oder gar lokalisiert (z.B. rechts-zu-links Schreibweise), sollte man das gleich von der ersten Stunde an machen. Dazu bietet Swing gute Unterstützung und es gibt eine Reihe Frameworks, welche die Verwaltung der textlichen Sachen übernehmen. Da sollte man vor allem ein paar Artikel zum Thema lesen, bevor man was eigenes bastelt. I18N und L10N ist ein sehr komplexes Thema, das oft unterschätzt wird. Mit ein paar falsch gesetzten Satzzeichen schafft man es gleich eine ganze Kultur zu beleidigen. Ein anderer grober Fehler sind Labels, in welche die Texte nicht komplett reinpassen.

8. Um wieder auf den Punkt 1 zu verweisen, sollte man sein gesamtes Programm so auslegen, dass es komplett ohne GUI laufen kann. Später kann es passieren, dass man vielleicht das Programm auf einem Server ohne einer Benutzeroberfläche laufen lassen oder es automatisieren will.

So, das war es erst mal, vielleicht fällt mir später noch mehr ein. Der Hauptpunkt ist, den man sich unbedingt merken muss, dass komplexere GUIs viel Zeit erfordern. Während dessen bleibt aber die Entwicklung nicht stehen und man muss regelmäßig seine Sachen an den aktuellen Stand der Zeit anpassen. Auch, dass man vielleicht für die Version 2.0 alles über den Haufen wirft und eine komplett neue GUI implementiert, ist sehr wahrscheinlich. Deshalb sollte man von Anfang an darauf vorbereitet sein und Abstraktion ist ein gutes Mittel dafür. Abschließend möchte ich sagen, dass die Logik und die Daten die GUI bestimmen sollen und nicht umgekehrt.

Slawa
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
@slawaweis
Wenn man diese Art der Flexibilität wünscht kann man
  • sich wie von dir demonstriert einen Abbrechen (nicht böse gemeint ;) )
  • MVC vergessen und stattdessen MVA verwenden
Wenn du ein schönes Beispiel sehen willst wie man Model-View-Adapter sauber umsetzt, also eine Command und eine Adapter Schicht mit einem Model koppelt, dann schau dir mal EMF an. Generier dir das Modell, generier dir die Commands und Adapter (EMF Edit) und zum Schluss den Baumeditor der zur Anzeige und Manipulation den EMF Edit Code verwendet.
Dafür muss man dann auch keine Zeile selbst schreiben ;)
Der EMF Editor ist natürlich nur ein Beispiel. In der Eclipse Welt kann der gleiche Code verwendet werden um einen mit GMF generierten grafischen Editor anzuschließen, ohne Eclipse zb eine Swing, Qt, was auch immer Präsentationsschicht verwenden.
 

tobe77

Mitglied
ok Vielen Dank für die vielen Antworten. Könnt ihr mir noch sagen wie ein Adapter (objektbasiert) aussieht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
T Aufbau einer Seite AWT, Swing, JavaFX & SWT 18
T JavaFX Falscher Wert getLayoutBounds? + Tipps zum Code-Aufbau? AWT, Swing, JavaFX & SWT 8
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
O newbie: GUI Aufbau AWT, Swing, JavaFX & SWT 5
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
dzim JavaFX Aufbau eurer Anwendungen AWT, Swing, JavaFX & SWT 0
B GUI-Aufbau nach eingelesener XML AWT, Swing, JavaFX & SWT 4
J Swing neuer Aufbau des Frames nach Click AWT, Swing, JavaFX & SWT 8
E Swing GUI aufbau abwarten? AWT, Swing, JavaFX & SWT 3
H Grundwissen zum GUI Aufbau AWT, Swing, JavaFX & SWT 10
D Swing Frage zum aufbau eines Programms AWT, Swing, JavaFX & SWT 24
S Beim Aufbau GUI: java.lang.IllegalAccessError in javax.swing AWT, Swing, JavaFX & SWT 6
S bei JFrame aufbau ein JProgressMonitor AWT, Swing, JavaFX & SWT 5
S Aufbau Damebrett AWT, Swing, JavaFX & SWT 2
S Aufbau mehrerer verschiedener grafischer Oberflächen AWT, Swing, JavaFX & SWT 2
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Prüfung einer Eingabe auf Gleitkommazahl AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben