# GridBagLayout - zwei Spalten mit gleicher Größe



## peez (13. Jan 2010)

GUI in Java macht mich wahnsinnig...

Ich habe ein Formular mit insgesamt vier Spalten:

<Label> | <Eingabefeld> | <Label> | <Eingabefeld>

Jetzt will ich gerne, dass die Spalten der Eingabefelder immer gleich breit sind. Dafür habe ich jeweils den Labels GridBagConstraints mit weightx=1 gegeben und den Eingabefeldern GridBagConstraints mit weightx=100.

Leider sind die Spalten aber trotzdem nicht gleich breit... Woran kann das liegen? Oder verstehe ich die Bedeutung von weight falsch?


----------



## Ebenius (13. Jan 2010)

Die Bedeutung von weight hast Du falsch verstanden. Das GridBagLayout richtet sich (so lange der Container groß genug ist) nach der [c]preferredSize[/c] der Komponenten. Die Gewichte sagen dem Layout, wie überschüssiger Platz verteilt wird. Du musst also dafür sorgen, dass die Eingabefelder die gleiche [c]preferredSize.width[/c] haben und dass die Labels die gleiche [c]preferredSize.width[/c] haben. Wenn Du also möchtest, dass überschüssiger nur von den Labels aufgefuttert wird, dann gibst Du das Gewicht der Eingabefelder mit null an und das Gewicht der Labels mit [c]1[/c] oder mit [c]5[/c] oder einem anderen Zahlenwert. Wenn Du möchtest, dass das erste Label doppelt so viel extra Platz abbekommt wie das zweite, dann setzt Du das Gewicht des ersten Labels auf [c]2[/c] und das des zweiten auf [c]1[/c] (oder das des ersten auf [c]7[/c] und das des zweiten auf [c]3.5[/c]). Die konkreten Zahlenwerte interessieren nicht, nur ihr Verhältnis zueinander.

HTH, Ebenius


----------



## peez (13. Jan 2010)

Also wenn ich bei den Eingabefeldern immer den selben Wert als weight angebe und (testweise) ein setPreferredSize(new Dimension(10,10)) mache, sollten sie ja gleich groß sein wenn ich das Fenster größer ziehe... Sind sie leider immer noch nicht :-(

Hier mal mein Code:


```
int columns = countColumns(konfigList, getCurrentPage());
      int rows = countRows(konfigList, getCurrentPage());

      // Now put the Widgets on the Screen
      contentPanel.setLayout(new GridBagLayout());

      for (int x = 1; x <= columns; x++) {
        for (int y = 1; y <= rows; y++) {

          BriefingKonfiguration konf = getFieldAt(konfigList, getCurrentPage(), x, y);
          if (konf == null) {
            continue; // No Widget at this cell position
          }
          FeldDefinition feldDefinition = FeldDefinition(konf.getBriefingFeldDefinitionId());

          GridBagConstraints gbcLabels =
              new GridBagConstraints((x - 1) * 2, y - 1, 1, 1, 1, 1,
                  GridBagConstraints.NORTHEAST, GridBagConstraints.NONE,
                  new Insets(1, 3, 1, 3), 0, 0);


          JLabel lbl = new JLabel(konf.getLabel());
          contentPanel.add(lbl, gbcLabels);

          GridBagConstraints gbcFields =
              new GridBagConstraints(((x - 1) * 2) + 1, y - 1, 1, 1, 20, 1,
                  GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
                  new Insets(1, 3, 1, 3), 0, 0);
        
          Component comp = getComponent(konf);

          contentPanel.add(comp, gbcFields);
        }
      }
```


----------



## Ebenius (13. Jan 2010)

peez hat gesagt.:


> Also wenn ich bei den Eingabefeldern immer den selben Wert als weight angebe und (testweise) ein setPreferredSize(new Dimension(10,10)) mache, sollten sie ja gleich groß sein wenn ich das Fenster größer ziehe...


Mach mal nen Screenshot (oder zwei) und häng den an den nächsten Beitrag ("Anhänge verwalten").

Ebenius


----------



## peez (13. Jan 2010)

Hier bitte 

Die Felder zu Sendung und Sendewoche sind beides Textfelder. SendungsDatum hat fill=NONE, deshalb ist es kleiner.


----------



## Ebenius (13. Jan 2010)

Hm, setz doch bitte nochmal die preferredSizes auf 10,10 und mach noch einen Screenshot...

Ebenius


----------



## peez (13. Jan 2010)

Bittschön 

Direkt vor add() steht jetzt comp.setPreferredSize(new Dimension(10,10)).


----------



## Landei (13. Jan 2010)

Das _schreit_ ja geradezu nach FormLayout


----------



## peez (13. Jan 2010)

Jou ;-) Das hab ich aber sofort wieder rausgeschmissen, als ich bemerkt habe, dass die Elemente zwar mit dem Fenster wachsen aber nicht mehr schrumpfen...
Dazu wird irgendwo auf irgendwelche FAQs verwiesen, die ich nirgends finde.


----------



## Michael... (13. Jan 2010)

Wenn ich das richtig verstehe dann sollen die Labels ihre benötigte Breite bekommen und die restlcihe Breite gleichmäßig auf die Textfelder verteilt werden. Ein setzen PreferredSize sollte nicht notwendig sein, sofern GBC.fill auf HORIZONTAL gesetzt ist.

```
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GridBagLayoutDemo extends JFrame {
	private JTextField[] check = new JTextField[3];
	
	public GridBagLayoutDemo() {
		JPanel panel = new JPanel(new GridBagLayout());
		GridBagConstraints gbc1 = new GridBagConstraints(0, 0, 1, 1, 0, 1,
				GridBagConstraints.NORTHEAST, GridBagConstraints.NONE,
				new Insets(1, 3, 1, 3), 0, 0);
		GridBagConstraints gbc2 = new GridBagConstraints(0, 0, 1, 1, 100, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
                new Insets(1, 3, 1, 3), 0, 0);
		
		for (int row=0; row<3; row++) {
			String lab = "AA";
			for (int col=0; col<check.length; col++) {
				gbc1.gridx = col*2;
				gbc1.gridy = row;
				panel.add(new JLabel(lab), gbc1);
				lab += "AA";
				gbc2.gridx = col*2 +1;
				gbc2.gridy = row;
				JTextField field = new JTextField();
				if (row==0)
					check[col] = field;
				panel.add(field, gbc2);
			}
		}
		this.getContentPane().add(panel);
		this.setVisible(true);
	}
	
	public void printTextFieldWidth() {
		for (int i=0; i<check.length; i++)
			System.out.println("Breite Feld in Spalte " + i + ": " + check[i].getWidth());
	}

	public static void main(String[] args) {
		GridBagLayoutDemo demo = new GridBagLayoutDemo();
		demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		demo.setBounds(0, 0, 400, 200);
		demo.setLocationRelativeTo(null);
		demo.setVisible(true);
		demo.printTextFieldWidth();
	}
}
```


----------



## André Uhres (13. Jan 2010)

peez hat gesagt.:


> Ich habe ein Formular mit insgesamt vier Spalten:
> <Label> | <Eingabefeld> | <Label> | <Eingabefeld>


Hat das Layout wirklich nur 4 Spalten? Die Screenshots zeigen ja nicht, wo welches Layout benutzt wird.


----------



## Ebenius (13. Jan 2010)

Ich kann den Fehler auch überhaupt nicht nachvollziehen. Wieso rutscht denn der linke Teil im zweiten Beispiel ganz nach oben?

Ebenius


----------

