GridBagLayout - zwei Spalten mit gleicher Größe

peez

Bekanntes Mitglied
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?
 
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
 
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:

Java:
 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);
        }
      }
 
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
 
Hier bitte 😉

Die Felder zu Sendung und Sendewoche sind beides Textfelder. SendungsDatum hat fill=NONE, deshalb ist es kleiner.
 
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.
 
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.
Java:
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();
	}
}
 
Ich kann den Fehler auch überhaupt nicht nachvollziehen. Wieso rutscht denn der linke Teil im zweiten Beispiel ganz nach oben?

Ebenius
 

Neue Themen


Zurück
Oben