Swing GridBagLayout - constraints.anchor scheint nicht korrekt zu funktionieren?

Ademas

Mitglied
Hallo liebe Forum-Gemeinde.

erst einmal entschuldigt...ja GridBagLayout und ja, gab es schon millionen Fragen zu, aber ich finde keine Lösung zu meinem Problem :/

folgendes ist bei mir los:

Ich arbeite auf Arbeit an einem größeren Projekt und möchte für dieses Projekt einen kleinen Dialog bauen.
Soweit so gut, ich erstelle also eine Klasse "SmallDialog", diese erbt von JFrame.

Ich setze das Layout zu GridBagLayout und füge die Labels, die Textfelder und auch die beiden Buttons hinzu.
Ich setze die Größe und visible.
Das JFrame startet und alle Komponenten sind darauf auch zu sehen.

Nur leider habe ich oben am Rand des Frames noch einiges an Platz.
Ich setze den anchor auf "FIRST_LINE_START" aber es funktioniert einfach nicht.
Komisch das aber an sich das "LINE_START" und das "LINE_END" funktioniert und die Komponenten auch dementsprechen angezeigt werden.

Auch ist mir aufgefallen das wenn ich weighty setze (einmal für alle komponenten) die Buttons gar nicht berücksichtigt werden und dann dabei aus dem JFrame verschwinden :(

funktioniert es bei einem von euch(Code Beispiel folgt gleich)?
Woran könnte es liegen?

liegt es daran das JButton, JLabel und JTextField von Swing sind und GridBagConstraints aber zu AWT gehört?
Ich war immer der Meinung das der Layout Manager trotzdem funktioniert(funktionieren sollte?)

Es wäre sehr schön wenn mir hier jemand helfen könnte :/

Danke schonmal im Voraus
..ich dachte imemr ich hätte das GBL einigermaßen kapiert :/ ...Pustekuchen

Verwendete IDE: Eclipse
aktuellste Java version


Code:

Java:
public class SmallDialog extends JFrame {
	private static final long	serialVersionUID	= 2751044251008543772L;
	/*
	 * Initialize Components
	 */
	JLabel						lblIdent			= new JLabel("Identifier of new data class");
	JLabel						lblName				= new JLabel("Name of new data class");
	JTextField					txtIdentifier		= new JTextField();
	JTextField					txtName				= new JTextField();
	JButton						btnOK				= new JButton("OK");
	JButton						btnCancel			= new JButton("Cancel");

	public SmallDialog() {
		// Set title
		super("Insert new DataClass");
		setDefaults();

		GridBagConstraints constraints = new GridBagConstraints();
		// set constraints for the first component
		constraints.anchor = GridBagConstraints.FIRST_LINE_START; // already tried NORTH,NORTHEAST,PAGE_START
		constraints.weightx = 1.0;
		// already tried weighty 0.1 and 1.0;
		constraints.fill = GridBagConstraints.BOTH;
		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.gridheight = GridBagConstraints.RELATIVE;
		constraints.insets = new Insets(2, 10, 2, 10);
		// add first component
		this.add(lblIdent, constraints);
		// set the next component to be the last in this row
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		this.add(lblName, constraints);

		// change constraints again
		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.insets = new Insets(0, 10, 0, 10);
		this.add(txtIdentifier, constraints);
		//...and again -.-
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		this.add(txtName, constraints);

		//...aaand again
		constraints.fill = GridBagConstraints.NONE;
		constraints.weightx = 0;
		constraints.weighty = 1;
		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.anchor = GridBagConstraints.LAST_LINE_START;
		constraints.insets = new Insets(5, 10, 10, 10);
		this.add(btnCancel, constraints);
		//...and a list time...
		constraints.anchor = GridBagConstraints.LAST_LINE_END;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		this.add(btnOK, constraints);
		setVisible(true);

	}

	/**
	 * Sets default parameters for the Dialog.
	 */
	private void setDefaults() {
		this.setSize(350, 150); // When i set a smaller size, the buttons begin to vanish
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setLayout(new GridBagLayout());
		//		setResizable(false); // Already tried with disabled resize
	}

}
so siehts aus, Rot markiert ist der Platz der "verschwendet" wird.
dlgyp.jpg
 

Ademas

Mitglied
Danke für deine Antwort.
Bis eben nicht...
hatte aber schon mehrere diverse andere Artikel im Netz (dpunkt verlag java2s, oracle) zum Thema GBL gelesen.

Habe die FAQ eben nachgeholt. Konnte leider nichts finden was mir bei dem Problem helfen köntne oO?
Bin ich einfach zu blind / zu dumm meinen fehler zu finden oO?

Oder sollte man für jedes Element komplett neue constraints anlegen? Ich dachte imemr das ist nicht notwendig und dient bei vielen bloß um eine bessere Übersicht zu gewährleisten?

MfG
 

bERt0r

Top Contributor
Das Gitter
Das GridBagLayout erzeugt ein Gitter in dem die Componenten ausgerichtet werden. Welche und wieviele Gitterzellen überdeckt werden sollen, kann mit den gridx/y/width/height Variablen von GridBagConstraints festgelegt werden.

GridBagConstraints.gridx sagt, welches die erste überdeckte Zelle von links her ist
GridBagConstraints.gridy sagt, welches die erste überdeckte Zelle von oben her ist
GridBagConstraints.gridwidth wieviele Zellen in horizontaler Richtung überdeckt werden
GridBagConstraints.gridheight wieviele Zellen in vertikaler Richtung überdeckt werden
In deinem Code steht nirgends was von gridx oder gridy.
 

Ademas

Mitglied
Das ist richtig :/ , ich dachte das GridBagLayout wie das GridLayout auch bei zelle 0 anfängt (links oben), weiterhin bin ich der Meinung das GridBagLayout ungenutzte "koordinaten" überspringt und gar nicht in der GUI verwendet solange dort nichts implementiert ist. Oder sehe ich das Falsch, ich bin der Meinung diese Information von der Oracle Seite zu haben.

Ich gebe ja mit gridwidth relative und remainder an das nur diese 2 elemente in der aktuellen zeile sind, und da keine Zeile direkt angegeben ist, sollte es in der obersten zeile anfangen, und zusätzlich setze ich den Anchor auf "First_Line_Start" was ja eigentlich auch dafür sorgt das sich die gewünschte Komponente am Anfang der erste Zeile befindet.

Trotzdem habe ich es jetzt auch mit gridx und gridy versucht, leider immernoch nicht mit dem gewünschten Erfolg....

Ich verstehe es nicht...ich sollte das nachher nochmal komplett neu machen und alles bei jeder komponente per Hand neu setzen, ich melde mich dann hier und Poste den veränderten/neuen Code.

Über weitere Tips wäre ich natürlich trotzdem dankbar.

MfG
 

bERt0r

Top Contributor
Anchor bestimmt nur die Position innerhalb des Grid-Felds das dem Komponent durch gridx und y zugewiesen wird. Lies dir den Text durch, is alles super erklärt.
 

Ademas

Mitglied
Ich habe mir den Text durchgelesen ;)
Mehrere male, und eben nochmal, ich gebe zu ich habe das mit den Positionen wohl falsch verstanden ;)

ABER: Zu meiner Verteidigung muss ich sagen das dies keinen Einfluss auf das eigentliche Problem hat ;P

Jedenfalls, ich weiß nicht was ich vorhin anders gemacht habe, aber jetzt geht es oO
Und ich benutze auch dieses mal kein gridx und gridy (habe es aber zwischendurch drinne gehabt, soll heißen habe deinen Tip beherzigt ;) )

Um zu verhindern das meine Komponente im falle eines resize nach unten rutscht, habe ich unten einen leeren JPanel eingefügt der praktisch alles was unter der "eigentlichen GUI" erscheint ausfüllt.


Hier der Code :

Java:
 public class SmallDialog extends JFrame {
	private static final long	serialVersionUID	= 2751044251008543772L;
	/*
	 * Initialize Components
	 */
	JLabel						lblIdentifier		= new JLabel("Identifier of new data class");
	JLabel						lblName				= new JLabel("Name of new data class");
	JTextField					txtIdentifier		= new JTextField();
	JTextField					txtName				= new JTextField();
	JButton						btnOK				= new JButton("OK");
	JButton						btnCancel			= new JButton("Cancel");

	public SmallDialog() {
		// Set title
		setDefaults();
		GridBagConstraints constraints = new GridBagConstraints();

		// JLabel Identifier
		//		constraints.gridx = 0;
		//		constraints.gridy = 0;
		constraints.weightx = 1.0;
		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.anchor = GridBagConstraints.LINE_START;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.insets = new Insets(5, 10, 2, 5);
		this.add(lblIdentifier, constraints);

		// JLabel Name
		//		constraints.gridx = 1;
		//		constraints.gridy = 0;
		constraints.weightx = 1.0;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.anchor = GridBagConstraints.LINE_START;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.insets = new Insets(5, 5, 2, 10);
		this.add(lblName, constraints);

		//JtextField Identifier
		//		constraints.gridx = 0;
		//		constraints.gridy = 1;
		constraints.weightx = 1.0;
		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.anchor = GridBagConstraints.LINE_START;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.insets = new Insets(0, 10, 10, 5);
		this.add(txtIdentifier, constraints);

		// JTextField Name
		//		constraints.gridx = 1;
		//		constraints.gridy = 1;
		constraints.weightx = 1.0;
		constraints.anchor = GridBagConstraints.LINE_START;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.insets = new Insets(0, 5, 10, 10);
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		this.add(txtName, constraints);

		// JButton Cancel
		//		constraints.gridx = 0;
		//		constraints.gridy = 2;
		constraints.weightx = 1.0;
		constraints.anchor = GridBagConstraints.LINE_START;
		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.fill = GridBagConstraints.NONE;
		constraints.insets = new Insets(0, 10, 10, 10);
		this.add(btnCancel, constraints);

		// JButton OK
		//		constraints.gridx = 1;
		//		constraints.gridy = 2;
		constraints.weightx = 1.0;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.anchor = GridBagConstraints.LINE_END;
		constraints.fill = GridBagConstraints.NONE;
		this.add(btnOK, constraints);

		constraints.weightx = 1.0;
		constraints.weighty = 1.0;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.anchor = GridBagConstraints.LINE_START;
		constraints.fill = GridBagConstraints.BOTH;

		this.add(new JPanel(), constraints);

		pack();
		setVisible(true);

	}

	/**
	 * Sets default parameters for the Dialog.
	 */
	private void setDefaults() {

		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setLayout(new GridBagLayout());

	}

}
[/Java]

Auf jeden Fall trotzdem ein großes Danke an dich bERt0r.

Kann irgendwie nicht wirklich nachvollziehen woran es gelegen hat, aber naja :/

Beste Grüße und ein schönes Rest-Wochenende

Mas
 

bERt0r

Top Contributor
Na wenigstens. Ich bin auch kein GridLayout fan weil bei mir auch immer wieder solche unerklärbaren Probleme aufgetreten sind. Das liegt aber auch immer daran, wie man die constraints erstellt. Die GridLayout Experten hier könnten dir sicher Tipps geben, deine GBCs strukturierter, platzsparender und übersichtlicher zu definieren. Dann treten meist die komischen Probleme nicht auf.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N GridBagLayout- bzw Constraints nicht auf Panels anwendbar ? AWT, Swing, JavaFX & SWT 6
Student GridBagLayout - Probleme mit Constraints AWT, Swing, JavaFX & SWT 8
S GridBagLayout Felder formatieren AWT, Swing, JavaFX & SWT 1
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
C GridbagLayout verstehen lernen AWT, Swing, JavaFX & SWT 1
H GridBagLayout macht mich wahnsinnig :-( AWT, Swing, JavaFX & SWT 5
BabySuna darstellungsprobleme mit JTabbedPane und GridBagLayout AWT, Swing, JavaFX & SWT 8
CptK Positionieren von Elementen in GridBagLayout AWT, Swing, JavaFX & SWT 4
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
Mario1409 AWT GridBagLayout AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
K GridBagLayout mit reponsive Design AWT, Swing, JavaFX & SWT 2
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
T GridBagLayout Anfängerprobleme AWT, Swing, JavaFX & SWT 3
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
L GridBagLayout Anordnung AWT, Swing, JavaFX & SWT 3
M Gridbaglayout Spaltenbreite AWT, Swing, JavaFX & SWT 3
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
V GridBagLayout AWT, Swing, JavaFX & SWT 4
N LayoutManager GridBagLayout - Grundlagen AWT, Swing, JavaFX & SWT 6
Neumi5694 Swing Gridbaglayout - automatische Anpassung verhindern AWT, Swing, JavaFX & SWT 1
P AWT Problem mit Platzierung (GridBagLayout) AWT, Swing, JavaFX & SWT 2
F Breite beim GridBagLayout festlegen AWT, Swing, JavaFX & SWT 2
M Swing GridBagLayout Komponentengröße festsetzen AWT, Swing, JavaFX & SWT 1
J GridBagLayout mit Hilfe einer For-Schleife befüllen AWT, Swing, JavaFX & SWT 1
W GridBagLayout Größe geben AWT, Swing, JavaFX & SWT 1
HarleyDavidson Swing Seltsames Verhalten GridBagLayout AWT, Swing, JavaFX & SWT 11
W GridBagLayout mit fester Zellgrösse AWT, Swing, JavaFX & SWT 2
N Swing GridBagLayout: Ein Pixel Versatz AWT, Swing, JavaFX & SWT 2
B Swing Gridbaglayout unterschiedliche Zeilenhöhe AWT, Swing, JavaFX & SWT 6
H LayoutManager GridBagLayout AWT, Swing, JavaFX & SWT 1
N GridBagLayout - was fehlt? AWT, Swing, JavaFX & SWT 8
S Swing rowHeight und rowWeight im GridBagLayout AWT, Swing, JavaFX & SWT 1
N Swing GUI mit GridBagLayout AWT, Swing, JavaFX & SWT 4
A jpanel mit gridbaglayout auf hintergrundbild AWT, Swing, JavaFX & SWT 7
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
G GridBagLayout AWT, Swing, JavaFX & SWT 6
S GridBagLayout "links-rechts-layouten" AWT, Swing, JavaFX & SWT 7
T LayoutManager GridBagLayout / erwartetes Raster fehlt AWT, Swing, JavaFX & SWT 3
X Gridbaglayout gridx + gridy auslesen? AWT, Swing, JavaFX & SWT 7
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
N GridBagLayout - Zeitplan AWT, Swing, JavaFX & SWT 13
N Swing GridbagLayout AWT, Swing, JavaFX & SWT 4
S Swing gridbaglayout AWT, Swing, JavaFX & SWT 8
G GridBagLayout Problem AWT, Swing, JavaFX & SWT 4
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
X LayoutManager gridBagLayout wird nicht richtig Dargestellt AWT, Swing, JavaFX & SWT 5
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
T LayoutManager GridBagLayout - zwei jTable mit unterschiedlicher Höhe AWT, Swing, JavaFX & SWT 2
N LayoutManager GridBagLayout schummeln erlaubt ? AWT, Swing, JavaFX & SWT 2
D GridBagLayout AWT, Swing, JavaFX & SWT 9
J Swing Terminkalender Wochenansicht mit Gridbaglayout oder JTable AWT, Swing, JavaFX & SWT 16
C LayoutManager GridBagLayout - Anfängerfrage AWT, Swing, JavaFX & SWT 5
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
R GridBagLayout in GridBagLayout AWT, Swing, JavaFX & SWT 2
H Positionierungsprobleme beim GridBagLayout AWT, Swing, JavaFX & SWT 16
Furtano AWT GridBagLayout macht mir Sorgen AWT, Swing, JavaFX & SWT 3
A GridbagLayout positionierungsproblem AWT, Swing, JavaFX & SWT 4
earlgrey_tea GridBagLayout Componenten proportional vergößern AWT, Swing, JavaFX & SWT 12
D JTable im GridBagLayout -> gridwidth AWT, Swing, JavaFX & SWT 6
T GridBagLayout Problem AWT, Swing, JavaFX & SWT 3
D Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 8
J Swing GridBagLayout: Links-nach-rechts Orientierung statt zentriert AWT, Swing, JavaFX & SWT 12
R Größe eines Labels bei GridBagLayout festlegen AWT, Swing, JavaFX & SWT 9
B GridBagLayout Problem AWT, Swing, JavaFX & SWT 3
M LayoutManager GridBagLayout AWT, Swing, JavaFX & SWT 11
E LayoutManager GridBagLayout in BorderLayout - Abstand bei Resizing AWT, Swing, JavaFX & SWT 2
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
L LayoutManager GridBagLayout leere Zeilen AWT, Swing, JavaFX & SWT 4
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
N GridBagLayout Problem AWT, Swing, JavaFX & SWT 6
C Swing JTable "zerstört" GridBagLayout AWT, Swing, JavaFX & SWT 9
N LayoutManager GridBagLayout Größe fixieren AWT, Swing, JavaFX & SWT 3
M GridBagLayout AWT, Swing, JavaFX & SWT 7
V Swing Gridbaglayout Leeres Fenster AWT, Swing, JavaFX & SWT 2
R LayoutManager GridBagLayout Fragen AWT, Swing, JavaFX & SWT 10
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
M LayoutManager Einige Fragen zum GridBagLayout AWT, Swing, JavaFX & SWT 13
N GridBagLayout AWT, Swing, JavaFX & SWT 11
D Swing Problem mit Gridbaglayout bzw. Größenanpassung JPanels AWT, Swing, JavaFX & SWT 7
Y Swing GridbagLayout JTextfield zu klein AWT, Swing, JavaFX & SWT 5
L LayoutManager GridBagLayout spielt verrückt AWT, Swing, JavaFX & SWT 9
T LayoutManager GridBagLayout an Fenstergröße anpassen AWT, Swing, JavaFX & SWT 2
J Java GUI mit GridBagLayout AWT, Swing, JavaFX & SWT 3
Y LayoutManager Problem mit Gridbaglayout AWT, Swing, JavaFX & SWT 8
hdi LayoutManager GridBagLayout AWT, Swing, JavaFX & SWT 9
W GridBagLayout Falsche Größenanpassung AWT, Swing, JavaFX & SWT 6
R Swing Button-Größe in JPanel mit GridBagLayout nicht änderbar AWT, Swing, JavaFX & SWT 3
E Problem mit meiner GUI/GridbagLayout AWT, Swing, JavaFX & SWT 2
M LayoutManager GradientPaint auf GridBagLayout AWT, Swing, JavaFX & SWT 5
D LayoutManager GridBagLayout, Änderung zur Laufzeit AWT, Swing, JavaFX & SWT 4
G LayoutManager per Button GridBagLayout + Inhalt ändern AWT, Swing, JavaFX & SWT 2
M GridBagLayout zeilenweise füllen AWT, Swing, JavaFX & SWT 5
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
hdi Swing Problem mit GridBagLayout AWT, Swing, JavaFX & SWT 2
E LayoutManager GridBagLayout kurz vorm Wahnsinn! AWT, Swing, JavaFX & SWT 22

Ähnliche Java Themen

Neue Themen


Oben