FormLayout Panel-Breite

Andi_CH

Top Contributor
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.

Java:
	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();
	}

Java:
	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();
	}

Java:
	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;
	}
 

Anhänge

  • Example10.png
    Example10.png
    33,2 KB · Aufrufe: 56
  • Example10.java
    Example10.java
    10,2 KB · Aufrufe: 16
Zuletzt bearbeitet von einem Moderator:
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?
 
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.
 
Zuletzt bearbeitet:
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🙂
 
der Code enthält unbekannte Klasse wie DefaultFormBuilder und ist daher unbrauchbar 😉
in habe den Titel angepasst, wenn falsch dann Bescheid sagen
 
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.
 
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🙂

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 🙂
 

Zurück
Oben