Forum: PC-Programmierung [java]Automatisches Layout


von Vlad T. (vlad_tepesch)


Lesenswert?

hi,
Ich habe ein Problem mit dem Layout.
Ich erzeuge dynamisch verschachtelte Komponenten.
Im wesentlichen die zwei:

einmal eine Group-Komponente (abgeleitet von Panel), das beliebig viele 
weitere Komponenten enthalten kann (auch weitere Groups).
Eine Group enthält eine optionale Überschrift, so wie ein Icon.
Group hat ein Gridlayout.

dann gibt es ein Element (auch abgeleitet von Panel), das enthält 
Eingabefelder und Buttons und ist einzeilig. (Gridbag-Layout)


Als Wurzelelement gibt es immer eine Group, die weitere Groups oder 
direkt Elemente enthält.

also:
group
  group
    element
    element
  group
    element
    element
    element
    element


da tritt auch schon das Problem auf.
Das Gridlayout eines Groupknoten macht alle Unterknoten gleich hoch, 
unabhängig davon, wie viele ELmente in diesem Knoten enthalten sind.
Was ich will ist natürlich, dass die Eingabefelder und Buttons alle 
gleich groß sind. Sprich die Größe soll in die andere Richtung 
propagiert werden, also von unten nach oben, anstatt von oben nach 
unten.
Insgesamt soll trotzdem der gesamte zur Verfügung stehende Platz 
ausnutzt werden.

Jemand eine Idee, wie man das hinbekommt?
ein anderer LayouManager? wenn ja welcher

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

> einmal eine Group-Komponente (abgeleitet von Panel),
Hm.. warum das denn? reicht dir Panel nicht?

> Eine Group enthält eine optionale Überschrift, so wie ein Icon.
> Group hat ein Gridlayout.
Outsch...

> dann gibt es ein Element (auch abgeleitet von Panel), das enthält
> Eingabefelder und Buttons und ist einzeilig. (Gridbag-Layout)
s.o. wofür die Ableitung?

> da tritt auch schon das Problem auf.
> Das Gridlayout eines Groupknoten macht alle Unterknoten gleich hoch,
Wohl nicht die API gelesen ;) genau das macht ein Gridlayout, alle 
Elemente im Container sind gleich groß.

> Jemand eine Idee, wie man das hinbekommt?
Nicht so viel Ableiten ;)

> ein anderer LayouManager? wenn ja welcher
BorderLayout.
North = Label mit Text/Icon
Center = Panel mit Box(Layout)? oder so

Vielleicht ist "GroupLayout" auch das was du suchst? Für Automatisches 
Layout gibt es auch noch Springlayout:
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html

von Vlad T. (vlad_tepesch)


Lesenswert?

Läubi .. schrieb:
>> einmal eine Group-Komponente (abgeleitet von Panel),
> Hm.. warum das denn? reicht dir Panel nicht?
hat noch spezielle Methoden und Eigenschaften.
>
>> Eine Group enthält eine optionale Überschrift, so wie ein Icon.
>> Group hat ein Gridlayout.
> Outsch...
???

>
>> dann gibt es ein Element (auch abgeleitet von Panel), das enthält
>> Eingabefelder und Buttons und ist einzeilig. (Gridbag-Layout)
> s.o. wofür die Ableitung?
s.o.
hat noch spezielle Methoden und Eigenschaften.

>
>> da tritt auch schon das Problem auf.
>> Das Gridlayout eines Groupknoten macht alle Unterknoten gleich hoch,
> Wohl nicht die API gelesen ;) genau das macht ein Gridlayout, alle
> Elemente im Container sind gleich groß.

>
>> Jemand eine Idee, wie man das hinbekommt?
> Nicht so viel Ableiten ;)
warum?
wenn ich ein Panel um eigene Construktoren/Eigenschaften/Methoden 
erweitern will, sollte doch Vererbung das Mittel der Wahl sein.

>
>> ein anderer LayouManager? wenn ja welcher
> BorderLayout.
> North = Label mit Text/Icon
> Center = Panel mit Box(Layout)? oder so
Ja gut, das Panel selbst ist borderlayout.
das Center, was die anderen Componenten enthält ist Gridlayout,

>
> Vielleicht ist "GroupLayout" auch das was du suchst? Für Automatisches
> Layout gibt es auch noch Springlayout:
> http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html

Bei Springlayout steht immer, das das eher für Guibuilder gedacht ist 
und ansonsten extrem viel Handarbeit.

Das Hauptproblem, was ich sehe ist, dass eigentlich 2 Passes nötig sind.
Einer von unten nach oben, wo die Elemente alle gleich groß sind und 
sich die Größen der Elternelemente dadurch ergeben. und dann eine 
Skalierung des ganzen auf die volle Fenster/Panel-Fläche.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich denke es sollen eben nicht alle Elemente gleich groß sein...
Wenn alles gleich groß sein soll dann nimm GridLayout, nutze eine 
Unterliegende Datenstruktur welche deine Hierarchie repräsentiert und 
nutze dann ein Panel mit GridLayout was aus dieser Generiert wird.

Vlad Tepesch schrieb:
> hat noch spezielle Methoden und Eigenschaften.
Ein Panel ist ein GUI Element ich hab irgendwie das Gefühl das du da 
Dinge reinquetscht die eher ins Datenmodell gehören (s.o.)

Vlad Tepesch schrieb:
> Bei Springlayout steht immer, das das eher für Guibuilder gedacht ist
> und ansonsten extrem viel Handarbeit.
Du schriebst doch das das Layout automatisch erzeugt wird...

von Vlad T. (vlad_tepesch)


Angehängte Dateien:

Lesenswert?

Läubi .. schrieb:
> Ich denke es sollen eben nicht alle Elemente gleich groß sein...
Die Schaltflächen sollen alle gleich Groß sein (bzw eigentlich nur 
gleich hoch), Die Gruppen sollen sich der Anzahl der Elemente anpassen.
Insgesammt soll das ganze aber so skaliert sein, dass der ganze zur 
verfügung stehende Platz eingenommen wird.

> Wenn alles gleich groß sein soll dann nimm GridLayout, nutze eine
> Unterliegende Datenstruktur welche deine Hierarchie repräsentiert und
> nutze dann ein Panel mit GridLayout was aus dieser Generiert wird
Das ist nicht so einfach möglich, da die gruppen durchaus 
unterschiedliche Spaltenanzahlen haben können.

Ich hol mal etwas weiter aus:
Anwendungszweck ist eine einfache Anwendung zum Zählen und 
Protokollieren von Fehlern in Feldtests, die frei konfigurierbare 
Problemfälle darstellen soll. (für ein Tablet oder Convertible)

Je nach Zielanzeigegerät, Testcases oder Vorlieben 
(Hochformat/Querformat) kann man das ganz leicht per XML-Anpassen.
Siehe Screenshot

Läubi .. schrieb:
> Ein Panel ist ein GUI Element ich hab irgendwie das Gefühl das du da
> Dinge reinquetscht die eher ins Datenmodell gehören (s.o.)

nö, das datenmodell ist schon getrennt.
Trotzdem managet die Klasse halt die Erzeugung und Auswertung der 
Kindelemente.

Läubi .. schrieb:
> Du schriebst doch das das Layout automatisch erzeugt wird...

in dem Sinne, dass auf Basis einer anderen Datenstruktur dynamisch die 
Elemente erzeugt werden. Dies aber von Hand im Code.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> Das ist nicht so einfach möglich,
Wenn es einfach wäre könnte es ja jeder ;)
Was soll den jetzt gleich groß sein? Zeilen gleich hoch?

von Achim (Gast)


Lesenswert?

Wenn du beim Aufbauen der GUI schon weißt wieviele Zeile jede Group hast 
kannst du ein GridBagLayout nehmen. Ein Panel einer Group bekommt dann 
entsprechend viele Zeilen im Grid zugewiesen (z.B. Testfälle A: 3 und 
Fehlverhalten: 4).

von Vlad T. (vlad_tepesch)


Lesenswert?

Läubi .. schrieb:
> Was soll den jetzt gleich groß sein? Zeilen gleich hoch?

Ja, die Eingabezeilen sollen alle gleich hoch sein.

Achim schrieb:
> Wenn du beim Aufbauen der GUI schon weißt wieviele Zeile jede Group hast
> kannst du ein GridBagLayout nehmen. Ein Panel einer Group bekommt dann
> entsprechend viele Zeilen im Grid zugewiesen (z.B. Testfälle A: 3 und
> Fehlverhalten: 4).

das wäre eine Möglichkeit, aber dann müssten Titelzeilen genauso hoch 
sein, wie eine Eingabezeile.

Das selbe Problem entsteht, wenn ich jede Zeile in das Top-Panel werfen 
würde, ohne sie in Subpanel zu packen

edit:
das scheint aber immer noch besser  zu sein, als der aktuelle Zustand ;)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> das wäre eine Möglichkeit, aber dann müssten Titelzeilen genauso hoch
> sein, wie eine Eingabezeile.
Du kannst auch mit einer MateBorder + Titel + Icon arbeiten.

Ansonsten bleibt dir immer noch die Möglichkeit einen Eigene 
LayoutManager zu entwerfen, oder z.B. BoxLayout zu nutzen und dich auf 
WindwoResize Events  zu hängen und jeweil die Größe der Komponenten 
berechnen und anpassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.