Constraints dem GridBagLayout hinzufügen

Hallo,

ich versuche gerade das GridBagLayout zu konfigurieren.

Zuerst habe ich mal eines erstellt:

GridBagLayout layout = new GridBagLayout();

Beim GridLayout konnte ich die Anzahl der Zeilen und Spalten so festlegen:

GidLayout layout1 = new GridLayout(5, 10) //5 Zeilen & 10 Spalten.

Beim GridBagLayout muss ich dies mit den Constraints machen.

Also mal dieses erstellen:

GridBagConstraints constraints = new GridBagConstraints();

constraints.gridx = 5; //5 zeilen
constraints.gridy = 10; //10 spalten

Nun muss ich ja die constraints dem GridBagLayout hinzufügen mit “setConstraints”.

Also:

layout.setConstraints(constraints);

Doch so funktioniert das nicht?

Wie muss ich das machen?

MfG

im Internet nach jedem x-beliebigen GridBagLayout-Tutorial/ -Beispiel zu suchen kam nicht direkt in Sinn? :wink:

etwa
https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

in der API selber auch ein Beispiel mit der setConstraints-Methode, obwohl die eher exotisch ist
https://docs.oracle.com/javase/7/docs/api/java/awt/GridBagLayout.html

Ja, es gibt da einen Haufen Beispiele. Die gridx/gridy sind nicht die Größe, sondern die Koordinaten.

Und üblicherweise übergibt man die Constraints direkt, wenn man die component hinzufügt:

panel.add(button, buttonConstraints);
panel.add(slider, sliderConstraints);
panel.add(textField, textFieldConstraints);

Das kann recht schnell aufwändig und unübersichtlich werden. Ich versuche üblicherweise, Layouts durch verschachtelte BorderLayout, GridLayout und manchmal FlowLayout oder BoxLayout zu basteln, und meistens klappt das. Der einzige Fall, für den ich GridBagLayout verwende, ist sowas wie

------------------------------------------------------
| Label             | TextField | Button             |
------------------------------------------------------
| LabelWithLongText | TextField | Button             |
------------------------------------------------------
| Label             | TextField | ButtonWithLongText |
------------------------------------------------------

weil man sonst diese Spalten-Ausrichtung nicht hinkriegt. Da hatte ich mir mal eine utility-Methode gebastelt https://github.com/javagl/CommonUI/blob/master/src/main/java/de/javagl/common/ui/GridBagLayouts.java#L52 mit der man mit sowas wie

JPanel panel = new JPanel(new GridBagLayout());
int row = 0;
GridBagLayouts.addRow(panel, row++, 1, label0, textField0, button0);
GridBagLayouts.addRow(panel, row++, 1, label1, textField1, button2);
GridBagLayouts.addRow(panel, row++, 1, label2, textField2, button2);
...

schnell so Zeilen hinzufügen kann.

Ich würde um das DirtBagLayout einen Bogen machen, es gibt gute 3d-Party-Alternativen (FormLayout, TableLayout, MigLayout…), die sich viel intuitiver zusammenbasteln lassen, und sich auch eher so verhalten, wie man das erwartet.

Kommando zurück.

Es geht auch mit dem GridLayout.

Beim Googeln bin ich mal auf eine Seite gestoßen wo es hieß, das man beim GridLayout mit “new Dimension();” nur eine x oder y größe angeben kann, also so:

setPreferredSize(new Dimension(0, 25));

oder

setPreferredSize(new Dimension(25, 0));

da das GridLayout angeblich nur einen Wert beachtet und den anderen ignoriert. Also nicht bedie annimmt.
Das stimmt auch, ich hatte bereits ein JPanel wo das nur so funktioniert hat. Ich habe folgendes angegeben: setPreferredSize(new Dimension(25, 25));, dann hat das nicht funktioniert.

Beim meinem anderen JPanel wo ich die JLabels habe, funktioniert das aber auch mit beiden Werten??

Jetz verstehe ich die Welt nicht mehr??

Oder war das beim BorderLayout so?
Ich glaube ich habe Grid & BorderLayout verwechselt?

MfG

Ohne konkrete Fragen* kann man da wohl wirklich erstmal nur auf https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html verweisen. Für jedes Layout ein ausführbares Beispiel, was will man mehr?


* Ob du die Layouts verwechselt hast, weiß keiner. Aber Bei der Preferred size werden üblicherweise beide Werte berücksichtigt, auch wenn die Regeln dafür implementierungsabhängig sind.

Ergänzend möchte ich die in unserem Wiki zu findenden Artikel erwähnen, in denen viele der verfügbaren LayoutManagern erklärt sind.

http://wiki.byte-welt.net/wiki/LayoutManager_der_Standard-Java-API

Statt sich Gedanken über ein 3rd-Party Layout-Manager zu machen, kann man auch mal darüber reflektieren ob Swing noch die richtige Wahl ist. Gerade bei so rudimentären Fragen gehe ich von einem Anfänger aus der noch kräftig am lernen ist. Wenn man ein Legacy Swing Projekt weiterführen möchte ist das eine andere Geschichte.

JavaFx mal als Alternative in den Raum geworfen oder eben HTML5.

wenn man das in den Raum wirft, dann auch nicht weit zu Scala und hundert anderen Sonderalternativen,
die Zahl der Probleme für Perfektionisten mag dabei abnehmen, aber auch die Zahl der Kenner/ Helfer und Tutorials usw., einfach weil es sich aufspaltet

als Anfänger lernen heißt eben Sprache Java, einfache Mittel wie ArrayList statt Common-Collections, for-Schleifen statt Streams, und auch Swing ist da genau der passende einfache, extrem verbreitete Standard,

seien wir mal alle froh dass es nicht gar noch AWT ist :wink: wobei Unterschied auch nur begrenzt

Nö, kann man nicht.

JavaFX ist in Java enthalten. Das gehört zum Standard. Seit Java 8. Und es macht vieles besser als Swing.

Und HTML ist der de facto Standard für UI.

Aber wenn man etwas lernen möchte das man nie und nimmer gebrauchen kann, dann sollte man bei Swing anfangen.

1 Like