Constraints beim GridBagLayout richtig anwenden


#1

Hallo zusammen,

leider bin ich nicht herumgekommen um das GridBagLayout.

Wie das GridBagLayout funktioniert ist mir alles klar.
Dazu gibt es gute Unterlagen im Netz.

Nur beim Anwenden der „constraints“ gibt es Probleme.

Ich habe aktuell ein JPanel auf dem ich mehrere Checkboxen platziert habe.

Standard mäßig ordnet das GridBagLayout die Bedienelemente von der Mitte aus an (Center).

Ich möchte aber alle drei Checkboxen links anordnen und zwar die erste ganz links oben, die zweite links mittig und die dritte links unten.

Daraufhin habe ich es mal mit “anchor” versucht, leider passiert nichts.
Im Netz habe ich den Hinweis bekommen, dass man die weightx & weighty auf 1 setzen soll.

dann klappt es, solange ich nur eine einzige Checkbox am JPanel platziere.

Sobald ich eine zweite Checkbox aufs panel setze (natürlich mit eigenen Constraints), ist die zweite Checkbox ganz rechts angeordnet. Wenn ich bei der zweiten Checkbox: weightx & weighty kleiner mache also z.B. auf 0.1 setze, dann rutscht die zweite Checkbox weiter nach links in richtung Mitte.

Warum?

Ohne weightx & weighty geht nichts und mit passt auch garnichts mehr.

weightx & weighty gibt ja nur die länge und höhe der Zelle im Verhältnis zu den anderen an.

Wenn ich beides auf 0 setze, dann passiert auch nichts.

Das ist zum Verzweifeln.


#2

du probierst verschiedene Regeln aus die mehr oder weniger das machen was sie sollen und scheinst dich über alles aufzuregen,
was wünschst du dir denn was passiert und wie soll das automatisch passieren?
ach so, was benötigt hast du ja gesagt, aber dann auch ein wenig nach Regeln dazu vorgehen,


neben weightx & weighty, die auch nicht immer beide und gleich zu befüllen sind, gibt es noch ein paar logisch naheliegende andere Dinge in GridBagConstraints,
zuallererst zu nennen und entsprechend auch die ersten Parameter im einem Konstruktor sind gridx/ gridy

ist dir bewußt dass es ein Konzept von Zellen mit x- und y-Position gibt? dass du gar keine Koordinaten in deinem Posting nennst, läßt es etwas bezweifeln,

fill ist auch noch interessant, soll eine Komponente seine Zelle im Layout komplett befüllen oder nicht, wenn nicht dann mit anchor innerhalb der Zelle zu platzieren


wie das GridBagLayout von alleine reagiert ist etwas ungewiss,
eine einzelne Zelle eingefügt kann automatisch den gesamten Platz bekommen oder eher so klein wie nötig gehalten werden, dann in der Mitte des Panels liegen, oder links oben oder links mitte oder wer weiß wo,
genauso fraglich kann die eingefügte Komponente innerhalb dieser erstellen Zelle automatisch die ganze Zelle ausfüllen oder kleiner, dann die Frage wie angeordnet, mittig, linke oben oder … usw.

defensiv schlau ist immer, dazu keine Annahmen zu haben, sich nicht unbedingt dazu aufzuregen, sondern in Ruhe zu überlegen, zu testen, Standardverhalten feststellen und mit Konfiguration beeinflussen

wenn am Anfang eingefügt eine CheckBox in der Mitte erscheint kann theoretisch die erste Zelle bereits den kompletten Platz belegen und nur die Komponente darin mittig platziert sein,
mit deinem anchor-Test ohne Auswirkung ist dann aber ziemlich deutlich, dass die Zelle an sich klein ist,

weightx & weighty auf 1 bewirken genau wie zu vermuten, dass die Zelle nun den kompletten Platz in x und y-Reichtung bekommen,
wie danach die Komponente darin aussieht ist zu schauen, anscheinend bist du zufrieden, anchor tut was wenn nötig?


sobald eine zweite Zelle dazukommt ist umso wichiger wie es um die Kooridinaten x/y steht, hast du bei beiden 0/0? ungünstig,
jede eingefügte Komponente/ Zelle sollte eigene Koordinaten haben,

wenn gleiches x, dann gleiche Zeile, wenn gleiches y, dann gleiche Spalte,
alle Zellen in einer Zeile haben gleiche Höhe, alle Zellen in einer Spalte gleiche Breite,

je nach unterschiedlichen Kompontenen und unterschiedlichen weightx/ y für alle Zellen in einer Zeile/ Spalte wird die Aufgabe für das Layout, über alle Breiten und Höhen insgesamt zu entscheiden, evtl. schwierig…

so wie es klingt hat die erste Zelle bei dir Position 0/0 mit weight 1/1 und die zweite Position 1/1 mit weight 0.1/0.1, ist es so? Code würde genaueres zeigen
in meinem Fall klingt deine Beschreibung dazu jedenfalls passend, die zweite Spalte und zweite Zeile bekommt jeweils ca 10%, Verhältnis 1 zu 0.1, unten rechts halt etwas Platz

weil nicht mehr minimaler Platz ohne weight sondern durchaus 10% Platz, geht es halt etwas nach links, ca. 10% der Breite des Panels?
das klingt nach Konfiguration, nicht verwunderlich, was hattest du denn von den weight 0.1 erwartet?


man setzt natürlich nicht immer beide weight auf gleichen Wert, sondern sie haben unterschiedliche Bedeutung, Gewichtung in Höhe und Breite,

für dein Beispiel bieten sich drei Zellen untereinander an, Position 0/0, 0/1, 0/2,
ohne andere Konfiguration sollten 3 CheckBoxen untereinander wieder in der Mitte des Panels kommen,
weightx auf 1 gesetzt bei einer oder allen Boxen und anchor dürfte sie nach links verschieben, wohl noch in mittlere Höhe des Panels,
wenn weighty verwendet, dann wird auch die gesamte Höhe benutzt, je nach Verhältnis, 0.33 zu 0.33 zu 0.33 ist dabei genausogut wie 1 zu 1 zu 1,

wenn auf diese Weise jede Box/ Zelle ein Drittel der Höhe bekommt, kann anchor auch noch mitspielen
usw.


Probleme gibt es bei GridBayLayout genug, aber die einfachsten Beispiele, die sollten wohl noch gehen


#3

Mach mal eine Skizze, wie es aussehen soll, dann kann man auch mal eine Beispiellösung schreiben.


#4

Manchmal ist es beim GridbagLayout sinnvoll, noch eine weitere Dummy-Komponente (etwa ein leeres JLabel) zu verwenden, die den restlichen Platz konsumiert.

In den meisten Fällen verwende ich inzwischen aber lieber ein aus verschiedenen anderen Layouts zusammengesetztes Layout. Das BorderLayout ist dabei recht praktisch.


#5

Diese Erfahrung habe ich auch gemacht. Oft ist der Code übersichtlicher und auch flexibler, wenn man Die GUI in mehreren LayoutManagern verschachtelt.


#6

Danke für eure Antworten!

Ich werde dieses Wochenede etwas herumprobieren.
Ich meld mich dann wieder.

SG