Frage zu LayoutManagern - speziell BorderLayout

vfl_freak

Premium-User
Hallo zusammen,

ich habe (als relativer Java-Neuling) hier ein größeres Java-Projekt übernommen, bei dem mir jetzt folgende Frage hochgekommen ist :

Innerhalb dieses Projekts werden div. Panel, Scrollpanel etc. deklariert und ineinander verschachtelt hinzugefügt.
Nun ist sämtlichen Komponenten als Layoutmanager jeweils ein eigenes "borderLayout" hinzugefügt worden.

Macht das irgendeinen Sinn? Wenn ich es richtig sehe, macht dieses "borderLayout" doch nichts anderes, als die zugehörige Komponente in die vier Himmelsrichtungen plus CENTER einzuteilen ... wenn nun auf einer dieser Richtungen (bspw. NORTH) weitere Komponenten hinzufüge, kann ich doch dort ebenfalls das geleiche Layout anwenden, oder?

Beispiel:
Java:
BorderLayout borderLayout1 = new BorderLayout();
BorderLayout borderLayout2 = new BorderLayout();
BorderLayout borderLayout3 = new BorderLayout();
// ...
panelNORTH.setLayout( borderLayout1 );
panelSecond.setLayout( borderLayout2 );
panelThird.setLayout( borderLayout3 );
// ...
panelMAIN.add( panelNORTH, java.awt.BorderLayout.NORTH );
panelNORTH.add( panelSecond. java.awt.BorderLayout.CENTER );
panelSecond.add( panelThrid, java.awt.BorderLayout.WEST );
// usw. ....

Da ich doch mit dem Borderlayout nichts weiter tun kann, müsste es eigentlich völlig ausreichen, nur eine Variable zu deklarieren und sie dann allen Komponenten zuzuweisen, oder übersehe ich hier irgendwas :confused:

Bspw. so:
Java:
BorderLayout myLayout = new BorderLayout();
// ...
panelNORTH.setLayout( myLayout );
panelSecond.setLayout( myLayout );
 panelThird.setLayout( myLayout );
// ...
panelMAIN.add( panelNORTH, java.awt.BorderLayout.NORTH );
panelNORTH.add( panelSecond. java.awt.BorderLayout.CENTER );
panelSecond.add( panelThrid, java.awt.BorderLayout.WEST );
// usw. ....

Der liebe Kollege vor mir hat nämlich sage und schriebe 29 (in Worten neunundzwanzig) dieser Variablen angelegt (wirklich von 1 bis 29 durch nummeriert) und dann zugewiesen .....

Danke im voraus für eine gute Erklärung :p
Gruß
Klaus
 
Seltsam, du hast für mich immer den Eintdruck von min. einen fortgeschrittenen User gemacht. Wenn ich dich nicht falsch verstanden habe, geht es nicht. Das BorderLayout kann pro Richtung nur einen Comp. hinzufügen. Ich denke, dir könnte ein vertikales BoxLayout helfen, um links und rechts davon hinzuzufügen das FlowLayout. Allerdings machen vermischte Layoutmanager oft was sie wollen, du musst wohl etwas herumexperimentieren.
 
Seltsam, du hast für mich immer den Eindruck von min. einen fortgeschrittenen User gemacht.
Thank you for the flowers .... ;)
Naja, ich bastel schon seit rund 2 Jahren mit Java rum, bin dabei aber 'nur' Autodidatkt, da ich eigentlich aus der C/C++-Welt komme ... und ich habe mich noch nie so richtig intensiv mit den Layoutmanagern befasst!

Wenn ich dich nicht falsch verstanden habe, geht es nicht. Das BorderLayout kann pro Richtung nur einen Comp. hinzufügen. Ich denke, dir könnte ein vertikales BoxLayout helfen, um links und rechts davon hinzuzufügen das FlowLayout. Allerdings machen vermischte Layoutmanager oft was sie wollen, du musst wohl etwas herumexperimentieren.
Naja, das Borderlayout ist schon das Gewünschte.
Mit ist nur nicht wirklich klar, was die einzelne Komponente wirklich damit macht. Ich hatte gehofft, genau ein Layout zu deklarieren zu können und es dann allen entsprechenden Komponenten zuweisen zu können.
Letztlich muss doch nur jede Komponente wissen, das die Bereiche Nord, West,... gibt, oder nicht ?

Gruß
Klaus

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EDIT :

Ist heute wohl nicht mein Tag ... es geht ja wesentlich einfacher, indem ich die Deklaration komplett weglasse :
Java:
panelNORTH.setLayout( new BorderLayout() );
panelSecond.setLayout( new BorderLayout() );
panelThird.setLayout( new BorderLayout() );
// ...

4 Stunden Schlaf waren dann wohl doch zu wenig ... :D
 
Zuletzt bearbeitet:
Ähm... Also ich finde den Aufbau ja sehr interessant xD Beim BorderLayout kann man max. 5 Komponenten (eine je Himmelsrichtung + Center) hinzufügen. Dein Vorgänger hat wohl ein paar Komponenten mehr hinzufügen wollen, nehm ich mal an. Merkwürdig finde ich allerdings die Art und Weise, wie er das gemacht hat. Nahezu alle Komponenten nutzen standardmäßig das BorderLayout, es also explizit zu setzen macht von daher nicht viel Sinn, aber gut, das wäre jeweils nur eine Zeile. Viel lustiger finde ich jedoch die Tatsache, dass dein Vorgänger tatsächlich Variablen angelegt hat, was sinnfrei ist (außer er konfiguriert das jeweilige Layout um). Prinzipiell hätte folgendes gereicht:
Java:
panel.setLayout(new BorderLayout));

An sich ist es nicht schlimmes, wenn man verschiedene und mehrere Layouts mit einer vermischt, allerdings sollte man dann über deren Verhaltensweisen bescheid wissen. Da das Verhalten der Komponenten oft sehr unterschiedlich ausfallen soll, z.b. dass Textfelder sich in der Breite dem Fenster anpassen, aber nicht in der Höhe, Buttons sich gar nicht anpassen sollen oder Panels sich sowohl in Breite als Höhe anpassen sollten, kann man oft sehr komplexe Strukturen erschaffen, durch die dann niemand mehr durschschaut. Ich halte es deswegen immer so, dass ich mir Skizzen zeichne, wie die GUI aussehen könnte und wenn mir ein Versuch gefällt, dann überlege ich, wie sich die Komponenten verhalten sollen und wie viel Platz sie tatsächlich brauchen. Dafür kann man dann z.B. mit einem dünnen Bleistift ganz leichte Gitter zeichnen, bis das alles einen Sinn ergibt. Naja, und dann erst bastel ich die GUI. Dabei verwende ich mitlerweile eigentlich nur noch das GridBagLayout, weil es sehr dynamisch in der Konfiguration ist und wenn man erst einmal den Umgang mit dem Manager verstanden hat, dann ist es auch gar nicht mehr schwer. Man muss sich nur vorher Gedanken machen, wie was aussehen und wo es positioniert sein soll.

Also das, was dein Vorgänger da gemacht hat ist in meinen Augen absoluter Humbug, aber jeder hat eben seinen eigenen Stil ;)
 
Moin Akeshihiro,

ja, in vielen Punkten stimme ich mit Dir überein!
Allerdings macht hier aufgrund verschiedener Vorgaben der Aufbau mittels "borderLayout" schon Sinn!
Die Anwendung ist von vorne herein so geplant worden, dass es diese 5 Bereiche (Nord, West, Center, Ost und Süd) gibt, die dann mit weiteren Komponenten gefüllt wurden. In der Mitte liegt eine zentrale Buttonleiste, über die wichtige, spezifische Funktionen aufgerufen werden und der linke Teil (also Westen) ist als mehr oder weniger reiner Anzeigebereich wichtiger, generierter Daten bewusst fix programmiert. Nur 'Osten' wird dann ggf. dazu skaliert! Weiterhin läuft die Anwendung auf allen Clients gezielt im Vollbildmodus ....

Ich habe Variablendeklaration jetzt gestern komplett entfernt und auf
Java:
panel.setLayout( new BorderLayout() );
umgebaut.

Allerdings werde ich mich für zukünftige Erweiterungen mal intensiver mit den anderen Layouts beschäftigen müssen. Da werde ich wohl "Herrn Google" mal beschäftigen müssen ....

Danke für Eure Meinungen und Hinweise!
Gruß
Klaus


 
Mein Favorit ist und bleibt das Tablelayout und dazu TableDancer als Tutorial.
Achtung in der Firma nie nur Tabledancer bei Google eingeben. Könnte ein
falsches Licht auf deine Arbeitsmoral werfen :)

Grüße
 
@vfl_freak
Ja gut, ich kenne die Oberfläche der Anwendung nicht, aber ich denke ich hätte es dennoch nicht mit so vielen BorderLayouts gemacht ^^

@FrankBooth
Is ganz nett, aber hab ich da richtig gelesen? Leichter als GridBagLayout? Nie und nimmer, jedenfalls nicht in meinen Augen xD Außerdem weiß ich gar nicht, warum immer gesagt wird, dass man beim GridBagLayout für die Flexibilität mit Komplexität bezahlen muss, weil man lange Einarbeitungszeiten braucht ... Ich find das Teil total easy und ich musste mich auch gar nich lange einarbeiten, ein Beispiel diagonal angeschaut, Parameter angeschaut und fertig, keine 10min. Vielleicht war ich aber auch nur so überwältigt davon, dass das so einfach gehn kann, weil ich vorher (kein Spaß) meine Guis immer mit Gemischen aus Flow-, Border- und GridLayouts zusammengezimmert hab und da sind einige unübersichtliche Sachen bei entstanden xD

Eine Alternative zum GridBagLayout ist es aber und wenn andere damit besser klar kommen, warum nich ;)
 
Zuletzt bearbeitet:
Mein Favorit ist und bleibt das Tablelayout und dazu TableDancer als Tutorial.
Achtung in der Firma nie nur Tabledancer bei Google eingeben. Könnte ein
falsches Licht auf deine Arbeitsmoral werfen :)
Da hast Du wohl Recht ... ergibt aber bestimmt prima Seiten :p;-]

@vfl_freak
Ja gut, ich kenne die Oberfläche der Anwendung nicht, aber ich denke ich hätte es dennoch nicht mit so vielen BorderLayouts gemacht ^^
Ja, wenn ich mal genügend Zeit hätte, würde ich mich vlt. auch mal an eine (mehr oder weniger) komplette Neu-Implementierung wagen.
Zumal ich hier auch noch mit relativ alter SW kämpfe (JBuilder7 resp. VS6 für C++ :-()

Aber ob ich das bis zu meiner Rente noch erlebe ..... ;)

Gruß
Klaus
 
Zurück