# Strukturieren von GUIs



## Ocean-Driver (20. Dez 2007)

Hallo,

Ich bin gerade dabei mir Wissen in der GUI-Programmierung anzueignen, wobei ich da jedoch leider noch garnicht durchblicke wie ich eine GUI *gut* strukturiere. Deswegen hätte ich ein paar Fragen an euch:


1) Baut ihr für jedes Fenster eine eigene Klasse?Öffnet ihr die einfach, indem ihr die Fenster initialisiert? (Sprich: _JFrame Subwin = new JFrame();_) Und schließst ihr die auch, indem ihr im Fenster wo dieses Fenster geöffnet wurde das Objekt gleich null setzt? (Sprich: _Main.Subwin = null;_) um auch das mehrfache öffnen zu verhindern?

2) Wie baut ihr die Oberfläche gut auf?Ich hab schon viel von GUI-Editoren gelesen, einige schwören drauf andere meinen die produzieren nur scheisse.Ich will aufjedenfall mir erstmal die Grundlagen "manuell" aneignen. Doch wenn ich den Code "kann", würde ich gern auf einen grafischen 'Bauer' umsteigen. Was ist da für nicht-kommerzielle Anwendungen umsonst gut?
Und dann noch eine technische Frage: Muss ich den Listener so nennen, den ich mir vererben lasse?Kann ich nicht einfach einen Listener programmieren und den so nennen wie ich will?

3) Baut ihr alle  Listener in eine Extra Klasse / in ein extra Package oder packt ihr direkt unter die Buttons?(Also als anonyme Klasse)


Das wars erstmal. Ich bedanke mich schonmal für eure antworten.


gruß
Ocean-Driver


----------



## Ocean-Driver (21. Dez 2007)

Will keiner mal was posten?


----------



## dieta (21. Dez 2007)

ICh schreib nur hobbymäßig Java, also nimm mich bitte nicht als Maßstab.
Meine Vorgehensweisen sind:
Fenster, die der User selbst öffnet, werden direkt vor dem Öffnen initialisiert. Die Fenster oder Panels, die in sie kommen liegen wegen der Übersichtlichkeit jeweils in einer eigenen Klasse vor.
Vom user geöffnete Fenster werden mit setVisible(false) geschlossen damit die eingegebenen Werte erhalten bleiben und die evtl. vorhandene Ladezeit beim nächsten Mal verkürzt wird.
Als GUI-Editor finde ich NetBeans ganz gut, das sit aber sehr stark Geschmacks- und Glaubenssache.
Listener baue ich immer in anonyme Klassen oder in die Fenster-Klasse ein, das aber eher aus Bequemlichkeit, weil ich hier schön auf die Werte der Klasse zugreifen kann.


----------



## Ocean-Driver (21. Dez 2007)

Ist das unsichtbar machen, nicht schlecht weil die Fenster im Hintergrund noch aktiv sind?
Würd vieleicht noch jemand posten, der das ganze auch auffer Arbeit benutzt?
Aber schonmal danke für deine Antwort!


----------



## dieta (21. Dez 2007)

Wie "noch aktiv"?
Die Ressourcen werden weiterhin belegt, bis der GC sie freiräumt. Threads für dieses Fenster muss man natürlich anhalten.


----------



## Ocean-Driver (21. Dez 2007)

Hi,

Wirkt sich das nicht negativ auf die Perfomance aus?


----------



## Wildcard (21. Dez 2007)

Sobald ein Fenster nicht mehr benötigt wird (auch in der Zukunft nicht), müssen die grafischen Resourcem mit dispose freigegeben werden.


> Baut ihr für jedes Fenster eine eigene Klasse?


Eine Klasse pro Fenster ist absolutes Minimum. JFrame sollte es dabei natürlich nur einen geben, der Rest ist mit Dialogen zu erledigen.
Oft bietet sich eine abstrakte Oberklasse für Dialoge an, die für ein einheitliches Design sorgen.
Der Content wird dann in konkreten Implementierungen umgesetzt. Ein solcher Dialog/Frame kann daher aus sehr vielen Klassen bestehen, je nachdem wie flexibel die Sache werden soll.
Stell dir zum Beispiel einen Preferences Dialog vor, in den sich zusätzliche Module einklinken können.


----------



## Wildcard (21. Dez 2007)

dieta hat gesagt.:
			
		

> Threads für dieses Fenster muss man natürlich anhalten.


Für Fenster darf es keine Threads geben, da alles was mit der GUI zu tun hat im Event Dispatcher Thread liegen muss.


----------



## Ocean-Driver (21. Dez 2007)

Hi,

Wie meinst du dass, nurnoch mit Dialogen?Jedes Fenster erbt ja von JFrame. In den Fenstern initialisiere und erzeuge ich die ganzen Buttons, TextFields, Panels.. 
Geh ich das komplett falsch an?Hast du vieleicht mal irgendeinen Sourcecode an dem ich mich mal orientieren könnte?


----------



## Wildcard (21. Dez 2007)

Mehr als ein JFrame pro Anwendung ist ein no-go für mich. Ein JFrame, ansonsten JDialogs.


----------



## Ocean-Driver (21. Dez 2007)

Ok, dann war mein Ansatz bisher falsch. Ich werd wohl nochmehr lesen  müssen 

//Edit:
Ich h ab mir jetzt mal in "Java ist auch eine Insel" was über Dialoge angelesen. Aber Dialoge sind doch nicht neue Fenster,oder?

Wenn ich zum Beispiel einen Button habe, der ein neues Fenster öffnet - reicht da doch ein einfacher Dialog nicht aus,oder?


----------



## Gast (27. Dez 2007)

Doch, klar.

Der JDialog erbt doch genau wie der JFrame von JWindow, und der ist die Oberklasse für Fenster. Mit dem JDialog kannst du praktisch das gleiche machen wie mit dem JFrame: JPanels hinzufügen und co.


----------



## JavaTom (27. Dez 2007)

Ocean-Driver hat gesagt.:
			
		

> Wie baut ihr die Oberfläche gut auf?Ich hab schon viel von GUI-Editoren gelesen, einige schwören drauf andere meinen die produzieren nur scheisse.Ich will aufjedenfall mir erstmal die Grundlagen "manuell" aneignen. Doch wenn ich den Code "kann", würde ich gern auf einen grafischen 'Bauer' umsteigen. Was ist da für nicht-kommerzielle Anwendungen umsonst gut?



Versuchs mal mit den neuen Netbeans 6.0 habe sehr gute damit gemacht. Damit kann man selbst als Anfänger in relativ kurzer Zeit eine etwas Zusammen basteln. 
Für Eclipse gibt es auch einige kostenlose Plugins.


----------



## Ocean-Driver (27. Dez 2007)

Hi,

NetBeans 6  hab ich mir mal runtergeladen. Nur, wie baue ich am besten die Events?
Ich hab jetzt ein Frame erstellt und da einige JButton angelegt, die verschiedene JDialogs öffnen soll.
Für Buttons ja einfach nen 'mouseClicked'-Event bauen,oder?
Also: Rechtsklick --> Events -->  Mouse --> mouseClicked

Nur, wie öffne ich dann das jDialog?


----------



## JavaTom (28. Dez 2007)

Indem du in die "Event-Funktion" den erzeugten JDialog mit setVisible(true) setzt.
Wenn du nur einen Standart Dialog brauchst kannst du auch einfach JOptionPane realisieren.
Anleitung zu JOprionPane


----------



## MichiM (29. Dez 2007)

an die erfahrenen Swing-Designer hier:

Gibt es einen Swing-GUI-Editor, bei dem man nicht mit dem ständigen Risiko leben muss, dass einem bei einem Klick das ganze Layout (außer per Restore eines Backups) unwiderbringlich verwüstet wird?

Arbeite noch mit NetBeans 5.5 und ich denk, es ist der Matisse, mit dem man mit viel Geduld schon was hinbekommt, allerdings, wie gesagt: Ein falscher Klick und alles ist dahin, keine Chance mit Ctrl-Z. Auf mich wirkt das Ganze im besten Falle sehr undurchsichtig, wenn nicht unausgereift und fehlerhaft.

Komponentengefüge in übergeordnete Container zu verschieben, was ab und zu sein muss, ist da ein Graus...

Über NetBeans 6 hab ich allerdings bisher auch nicht viel Gutes gelesen. Von der Idee ganz gut, praktisch allerdings zu kompliziert, heißt es. Kann ich so weit nachvollziehen. :wink: 


Ich möchte im Wesentlichen mit statischen Layouts arbeiten. Ich stell mir was ähnlich wie Visual Studio vor, da geht zumindest das Zusammenklicken gut und stabil in kurzer Zeit, allerdings sollte es eben was für Swing und nicht .NET sein. :wink:


Welchen GUI-Builder könnt Ihr für Swing empfehlen?


----------



## JavaTom (30. Dez 2007)

Wieviel darf es den Kosten?
Visual Studio 2008 kostet  in der Standard Version schon über 300 €.


----------



## MichiM (30. Dez 2007)

Naja, ein bisschen ein Preis ist schon ok, sag ich mal.  :wink:

Wichtig wär mir halt, dass man vernünftig, ohne ständige pieksende Ärgernisse, damit arbeiten kann.


Gibt es da zur Zeit schon was Empfehlenswertes für Swing?



(Für JSF gibt es ja offenbar auch noch wenig GUI-Klick-Unterstützung, NetBeans 6 hat da ja erstmals was dabei, werd ich mir mal anschauen. Mir kommt es so vor, als gäbs mitunter deswegen so wenig Java-GUI-Software, weil es so mühselig ist, eine gescheite Oberfläche zu erstellen. Woran liegt denn das? Bei der Konkurrenz - .NET, Delphi, usw. - gehts doch auch und zwar schon lang. Liegts an der Swing-Architektur, den ganzen Layout-Typen und Komponentenabhängigkeiten...? Naja. Schade irgendwie. :wink: )


----------



## anfänger15 (1. Jan 2008)

Wildcard hat gesagt.:
			
		

> Sobald ein Fenster nicht mehr benötigt wird (auch in der Zukunft nicht), müssen die grafischen Resourcem mit dispose freigegeben werden.



Ist das nicht nur bei AWT Komponenten der Fall oder muss man das auch bei Swing machen?


----------



## Illuvatar (1. Jan 2008)

Auch ein JFrame ist ein java.awt.Window


----------



## anfänger15 (1. Jan 2008)

Ja, das schon aber wenn der JFrame geschlossen wird wird normalerweise ja auch das komplette Programm beendet und die Ressourcen sollten dann sowieso freigegeben werden. Mir ging es eigentlich darum ob man dispose auch bei z.B. JButton aufrufen muss.

Nach logischen nachdenken ist mir aber klar geworden, dass Swing gezeichnet wird und somit keine Ressourcen freigegeben werden müssen. Somit denke ich ist dies nicht nötig, lasse mich aber gerne eines besseren belehren.

danke


----------



## Ocean-Driver (2. Jan 2008)

Hi,

Also wenn ich ein Unterfenster eines Programmes aufhab, brauch ich es nicht mit 'Fenster = null' freigeben?

Also, wenn ich etwas schließe, reicht es die sichtbarkeit auf false zu setzen? Wird dann auch keine Perfomance mehr verbraucht?
Ich will ja schließlich keine schlechten Programme entwickeln.


----------



## HLX (3. Jan 2008)

Gute grafische Benutzeroberflächen zeichnen sich durch benutzerfreundlichkeit und nicht durch Speicherersparnis aus.

Ist dir bei verschiedenen Anwendungen schonmal aufgefallen, dass ein von dir geschlossenes Fenster beim nächsten Öffnen den letzten Zustand wieder herstellt, in dem z.B. die enthaltenen Komponenten die gleiche Größe haben, wie von dir zuvor eingestellt? Das liegt daran, dass das Fenster im Hintergrund noch in seiner zuletzt eingestellten Form vorhanden war - der benutzerfreundlichkeit wegen.

Im Übrigen ist es auch nicht gerade performant ein Fenster jedesmal neu zu initialisieren.


----------

