Probleme mit GridBagLayout

Hallo,
ich bin neu hier im Forum und habe mich angemeldet, weil ich eine dringende Frage habe. Ich bin nämlich gerade dabei, mir eine Oberfläche für mein Programm mit dem GridBagLayout zusammenzubasteln. Leider klappt das nie so wie ich es will. Im Normalfall befinden sich die Schaltflächen irgendwo, nur nicht da, wo ich sie haben möchte, und auch in der faschen Größe. Und da mich das Problem jetzt schon fast zwei Wochen beschäftigt und ich im Internet keine gute Erklärung gefunden habe, frage ich jetzt hier nach.
Also, ich habe mir mit jvider (dem Plugin für Eclipse) die Oberfläche zusammengestellt. So sieht sie aus:

Wenn ich jetzt aber das Programm ausführe, kommt das hier heraus:

Es ist also im Grunde genommen das, was ich haben will, nur leider vollkommen falsch dimensioniert.
Hier ist noch der Code, den ```import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JLabel;
import javax.swing.JButton;

JPanel pnPanel0;
JLabel lbLabel0;
JButton btBut0;
JButton btBut1;
JButton btBut2;
JButton btBut3;
JButton btBut4;
JButton btBut6;

pnPanel0 = new JPanel();
GridBagLayout gbPanel0 = new GridBagLayout();
GridBagConstraints gbcPanel0 = new GridBagConstraints();
pnPanel0.setLayout( gbPanel0 );

lbLabel0 = new JLabel( “Überschrift” );
gbcPanel0.gridx = 6;
gbcPanel0.gridy = 1;
gbcPanel0.gridwidth = 18;
gbcPanel0.gridheight = 3;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 1;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbPanel0.setConstraints( lbLabel0, gbcPanel0 );
pnPanel0.add( lbLabel0 );

btBut0 = new JButton( “Button1” );
gbcPanel0.gridx = 10;
gbcPanel0.gridy = 5;
gbcPanel0.gridwidth = 10;
gbcPanel0.gridheight = 2;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 0;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbcPanel0.insets = new Insets( 0,0,1,0 );
gbPanel0.setConstraints( btBut0, gbcPanel0 );
pnPanel0.add( btBut0 );

btBut1 = new JButton( “Button2” );
gbcPanel0.gridx = 10;
gbcPanel0.gridy = 7;
gbcPanel0.gridwidth = 10;
gbcPanel0.gridheight = 2;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 0;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbcPanel0.insets = new Insets( 1,0,1,0 );
gbPanel0.setConstraints( btBut1, gbcPanel0 );
pnPanel0.add( btBut1 );

btBut2 = new JButton( “Button3” );
gbcPanel0.gridx = 10;
gbcPanel0.gridy = 9;
gbcPanel0.gridwidth = 10;
gbcPanel0.gridheight = 2;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 0;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbcPanel0.insets = new Insets( 1,0,1,0 );
gbPanel0.setConstraints( btBut2, gbcPanel0 );
pnPanel0.add( btBut2 );

btBut3 = new JButton( “Button4” );
gbcPanel0.gridx = 10;
gbcPanel0.gridy = 11;
gbcPanel0.gridwidth = 10;
gbcPanel0.gridheight = 2;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 0;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbcPanel0.insets = new Insets( 1,0,1,0 );
gbPanel0.setConstraints( btBut3, gbcPanel0 );
pnPanel0.add( btBut3 );

btBut4 = new JButton( “Button5” );
gbcPanel0.gridx = 10;
gbcPanel0.gridy = 13;
gbcPanel0.gridwidth = 6;
gbcPanel0.gridheight = 2;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 0;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbcPanel0.insets = new Insets( 1,0,0,1 );
gbPanel0.setConstraints( btBut4, gbcPanel0 );
pnPanel0.add( btBut4 );

btBut6 = new JButton( “Button6” );
gbcPanel0.gridx = 16;
gbcPanel0.gridy = 13;
gbcPanel0.gridwidth = 4;
gbcPanel0.gridheight = 2;
gbcPanel0.fill = GridBagConstraints.BOTH;
gbcPanel0.weightx = 1;
gbcPanel0.weighty = 0;
gbcPanel0.anchor = GridBagConstraints.NORTH;
gbcPanel0.insets = new Insets( 1,1,0,0 );
gbPanel0.setConstraints( btBut6, gbcPanel0 );
pnPanel0.add( btBut6 );

(leider gibt es hier im Forum keine Spoiler)
Meine Frage ist jetzt also: wie kriege ich es hin, dass die Oberfläche des Programms bei der Ausführung genau so aussieht wie die Vorlage?
Ich wäre froh, wenn mir jemand helfen könnte. Vielen Dank im Voraus und viele Grüße
corvus

P.S.: Ich habe es natürlich auch schon ohne jvider versucht, aber das sah noch schlimmer aus.
P.P.S.: Da ich vor kurzem erst richtig mit Java angefangen habe, wäre ich froh, wenn ihr nicht mit Fachwörtern um euch schmeißen würdet ;)

Im Wiki gibt es ein gutes Tutorial: Error | OPNsense
Das hast du sicher noch nicht gelesen. Das könnte aber helfen.

Doch gibt es

Nur noch keinen Button, der das Tag bequem in den Editor einfügt.
Aber da sind wir dran.

Es wäre infacher für uns, wenn wir kompilierbaren Quellcode zur Verfügung gestellt bekämen.
In deinem Code gibt es weder Klassen- noch Methodennamen…

Beim GridBagLayout werden alle Zellen ignoriert, die keinen Inhalt besitzen. Du kannst dir also 1000x1000 Zellen “definieren” (in Buildern) aber ohne Inhalt ist das Ganze dann trotzdem 0x0 Pixel groß.
Dass dein Label auf 6,1 startet ist also sinnfrei. Wenn du nicht Komponenten für deine 18 Zellen erstellen willst, ist also auch das gbcPanel0.gridwidth = 18; sinnfrei. Entsprechend dem gewünschten Layout reichen dir 4 Spalten.
Vergiss auch nicht, Java zieht alle Komponenten auf, um ins Panel zu passen, wenn das nicht willst, musst du schon Größen definieren (.setPreferredSize). Setzt du also die Größen der Komponenten und machst das Panel ein wenig größer, wird das auch alles schön zentriert sein, wie von dir gewünscht, ohne viel Aufwand drumherum.

Beispiel
[spoiler]

        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();
        filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(73, 27), new java.awt.Dimension(73, 27), new java.awt.Dimension(73, 27));
        filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(73, 27), new java.awt.Dimension(73, 27), new java.awt.Dimension(73, 27));

        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.setLayout(new java.awt.GridBagLayout());

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Überschrift");
        jLabel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jLabel1.setMinimumSize(new java.awt.Dimension(60, 27));
        jLabel1.setPreferredSize(new java.awt.Dimension(60, 27));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(10, 10, 5, 10);
        jPanel1.add(jLabel1, gridBagConstraints);

        jButton1.setText("jButton1");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 10, 5, 10);
        jPanel1.add(jButton1, gridBagConstraints);

        jButton2.setText("jButton2");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 10, 5, 10);
        jPanel1.add(jButton2, gridBagConstraints);

        jButton3.setText("jButton3");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 10, 5, 10);
        jPanel1.add(jButton3, gridBagConstraints);

        jButton4.setText("jButton4");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 10, 5, 10);
        jPanel1.add(jButton4, gridBagConstraints);

        jButton5.setText("jButton5");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.insets = new java.awt.Insets(5, 10, 10, 5);
        jPanel1.add(jButton5, gridBagConstraints);

        jButton6.setText("jButton6");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 10, 10);
        jPanel1.add(jButton6, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        jPanel1.add(filler1, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 1;
        jPanel1.add(filler2, gridBagConstraints);

[/spoiler]

Ok, zuerst mal vielen Dank euch beiden :slight_smile: Das Tutorial ist endlich mal ein richtig gutes!
Allerdings hat mir irgendwie immer die Information gefehlt, dass leere Zeilen ignoriert werden. Das erklärt so einiges :wink: (Danke mla.rue)
Dann werde ich mal etwas damit rumexperimentieren. Sollte irgendwas nicht klappen werdet ihr es sicherlich merken :smiley: