# FormLayout Panel-Breite



## Andi_CH (19. Aug 2011)

Ich erstelle den obersten Teil (die drei Label und Felder als JPanel)
(siehe buildInOutPanel() weiter unten)

In der übergeordneten Routine (buildTab()) frage ich dann wie breit das JPanel ist und möchte den Wert verwenden, um das Textfeld und das buttonPanel genau gleich breit darzustellen.
(Je nach Sprache der Texte wird das unterschiedlich breit)

Das buttonPanel wird allerdings zu breit - so rein heuristisch habe ich herausgefunden, dass ich 28 abziehen muss, damit es stimmt - was ist da los? Warum liefert mir die Frage nach der Breite des JPanels einen zu grossen Wert?

Das komplette Sourcefile habe ich angehängt.


```
private JPanel buildInOutPanel() {
		final int inOutFieldWidth = 100;

		JTextField aufLastFeld = new JTextField();
		JTextField deckenLastFeld = new JTextField();
		JTextField linienLastFeld = new JTextField();

		final int height = aufLastFeld.getSize().height;
		aufLastFeld.setSize(inOutFieldWidth, height);
		deckenLastFeld.setSize(inOutFieldWidth, height);
		linienLastFeld.setSize(inOutFieldWidth, height);
		String fmt = "max(pref;" + inOutFieldWidth + ")";
		linienLastFeld.setText(fmt);
		FormLayout formLayout = new FormLayout(
				"pref"								// Spalte 1
				+ ", 3dlu"							// Spalte 2
				+ ", " + fmt						// Spalte 3
				,
				"pref"								// Zeile 1
				+ ", 3dlu"							// Zeile 2
				+ ", pref"							// Zeile 3
				+ ", 3dlu"							// Zeile 4
				+ ", pref"							// Zeile 5
				+ ", 3dlu"							// Zeile 6
				+ ", pref"							// Zeile 7
		);
		PanelBuilder builder;
		if (debug) {
			builder = new DefaultFormBuilder(formLayout, new FormDebugPanel());
		} else {
			builder = new DefaultFormBuilder(formLayout, new JPanel());
		}
		builder.setDefaultDialogBorder();
		CellConstraints cc = new CellConstraints();
		builder.addLabel("Auflast nd (kN/m)",		cc.xy (1, 1));
		builder.add(aufLastFeld,					cc.xyw(3, 1, 1));
		builder.addLabel("Deckenlast vd (kN/m)",	cc.xy (1, 3));
		builder.add(deckenLastFeld,					cc.xyw(3, 3, 1));
		builder.addSeparator("",					cc.xy (3, 5));
		builder.addLabel("Linienlast vd (kN/m)",	cc.xy (1, 7));
		builder.add(linienLastFeld, 				cc.xy (3, 7));
		return builder.getPanel();
	}
```


```
private JComponent buildButtonPanel(int width) {
		JButton mButtonOK     = new JButton();
		JButton mButtonCancel = new JButton();
		Dimension buttonDim = new Dimension(100, 27);
		mButtonOK.setPreferredSize(buttonDim);
		// einige nicht relevante Zeilen entfernt - Actionlistener etc.

		mButtonCancel.setPreferredSize(buttonDim);
		// einige nicht relevante Zeilen entfernt

		DefaultFormBuilder builder;

// Warum muss hier -28 gerechnet werden?
		int space = Math.max(10, width - 28 - 2 * buttonDim.width);
		String fmt = space + "";
		FormLayout layout = new FormLayout(
				"pref, " + fmt + ", pref",
				"pref"
		);
		if (debug) {
			builder = new DefaultFormBuilder(layout, new FormDebugPanel());
		} else {
			builder = new DefaultFormBuilder(layout, new JPanel());
		}
		builder.setDefaultDialogBorder();
		CellConstraints cc = new CellConstraints();
		builder.add(mButtonOK,		cc.xy (1, 1));
		builder.add(mButtonCancel,	cc.xy (3, 1));
		return builder.getPanel();
	}
```


```
private JComponent buildTab(String title, JTextArea area) {
		JComponent inoutPanel = buildInOutPanel();
		final int width = inoutPanel.getMinimumSize().width;
		final String columnSpec = "max(" + 10 + ";pref)";
		FormLayout layout = new FormLayout(
				columnSpec,
				"pref, 9dlu, pref, 3dlu, fill:default, 9dlu, pref, 9dlu, pref"
		);
		PanelBuilder builder = new PanelBuilder(layout);
		builder.setDefaultDialogBorder();
		CellConstraints cc = new CellConstraints();
		builder.add(inoutPanel,			cc.xy(1, 1));
		builder.add(area,				cc.xy(1, 3));
		JComponent buttonPanel = buildButtonPanel(width);
		builder.add(buttonPanel,		cc.xy(1, 9));
		JComponent panel = builder.getPanel();
		return panel;
	}
```


----------



## Andi_CH (22. Aug 2011)

Montagmorgenpush ;-)

Sorry, aber das Problem mit den unterschiedlichen Dimensionen brennt mir immer noch unter den Nägeln.

Warum ist das so? Woher kommt die unterschiedliche Vorstellung von "Grösse"?
Wie gross ist denn der Unterschied - ist der wirklich einfach Konstant?


----------



## jgh (22. Aug 2011)

mal so ins Blaue geraten...hast du mal das [c]pack()[/c] auskommentiert und dann geschaut, ob die Größe passt?
Denn du "baust" dir ja deine Componenten zusammen, dabei fragst du die Größe ab, bekommst ein Ergebnis und am Ende rufst du auf den Frame nochmal pack() auf, was evtl. die Größendifferenz erklären könnte.


----------



## Andi_CH (22. Aug 2011)

Daran liegt es nicht

Einfach so nebenbei - ich poste nicht vergebens den Code (es wird ja auch immer wieder darauf hingewiesen, dass man lauffäfhige Beispiele posten soll - der Code läuft und ist virenfrei


----------



## SlaterB (22. Aug 2011)

der Code enthält unbekannte Klasse wie DefaultFormBuilder und ist daher unbrauchbar 
in habe den Titel angepasst, wenn falsch dann Bescheid sagen


----------



## Andi_CH (22. Aug 2011)

Da ja hier nichts konstruktives kommt schliesse ich das mal ab.
Wenn ich jetzt was anhänge wird der titel wieder geändert und passt dann gar nicht mehr zum Anfang.


----------



## jgh (22. Aug 2011)

Andi_CH hat gesagt.:


> Daran liegt es nicht
> 
> Einfach so nebenbei - ich poste nicht vergebens den Code (es wird ja auch immer wieder darauf hingewiesen, dass man lauffäfhige Beispiele posten soll - der Code läuft und ist virenfrei





Andi_CH hat gesagt.:


> Da ja hier nichts konstruktives kommt schliesse ich das mal ab.
> Wenn ich jetzt was anhänge wird der titel wieder geändert und passt dann gar nicht mehr zum Anfang.



Lauffähig bedeutet...kopieren, einfügen, ausführen.
Das geht mit deinem Code nicht, sonst hätte ich das schon gemacht.

Aber wahrscheinlich bist du eh gerade nicht gut drauf, wenn ich deinen letzten Post mal interpretiere


----------



## SlaterB (22. Aug 2011)

das ist schon eine Java-Datei mit kompletten Klassen im Anhang


----------

