GridBagLayout - Größenverhältnisse bleiben nicht stabil

Status
Nicht offen für weitere Antworten.
Hallo,
ich habe folgendes Problem. Ich habe mein Hauptfenster unterteilt in 3 verschiedene JPanel sowie mehrere JButton.
In den 3 JPanels werden nu im Laufe des Programms verschiedene Komponenten zugefügt, diese wieder entfernt rumgezeichnet etc.
Der Code für meine Methode Hauptfenster.einrichten ist folgender:
Code:
public void einrichten(){
		 //Layout setzen und Komponenten hinzufügen
	    GridBagLayout gbl = new GridBagLayout();
	    GridBagConstraints gbc;
	    getContentPane().setLayout(gbl);
	    
	    //TextPanel hinzufügen
	    gbc = LayoutMethoden.makegbc(0, 0, 6, 1, 15, 5, true);
	    gbl.setConstraints(tPanel, gbc);
	    getContentPane().add(tPanel);
	    
	    //ZeichenPanel hinzufügen
	    gbc = LayoutMethoden.makegbc(0, 1, 3, 1, 15, 15, true);
	    gbl.setConstraints(zPanel, gbc);
	    zPanel.setBackground(Color.WHITE);
	    getContentPane().add(zPanel);
		    
	    // ArbeitsPanel hinzufügen
	    gbc = LayoutMethoden.makegbc(3, 1, 3, 1, 15, 15, true);
	    gbl.setConstraints(aPanel, gbc);
	    aPanel.setBackground(Color.LIGHT_GRAY);
	    getContentPane().add(aPanel);
			    
	    //Button hinzufügen
	    for (int i=0; i<5; i++){
	        gbc = LayoutMethoden.makegbc(i, 2, 1, 1, 3, 1, false);
	        gbl.setConstraints(playButtonGroup[i], gbc);
	        getContentPane().add(playButtonGroup[i]);
	    }
	    
	    //Geschwindigkeitsregler hinzufügen
	    gbc = LayoutMethoden.makegbc(5, 2, 1, 1, 3, 1, true);
        gbl.setConstraints(geschwindigkeitsRegler, gbc);
        getContentPane().add(geschwindigkeitsRegler);

	    //Dialogelemente layouten
	    validate();
	    //pack();
	  }
Die statische Methode LayoutMethoden.makegbc(int x, int y, int width, int height, double wx,
double wy, boolean fill) setzt die GridBagConstraints wie folgt:
Code:
//Methoden zur Festlegung von GridBagLayout-Bedingungen
	public static GridBagConstraints makegbc(int x, int y, int width, int height, double wx,
			double wy, boolean fill) {
		return makegbc(x, y, width,height,  wx, wy, GridBagConstraints.CENTER, fill);
	}

public static GridBagConstraints makegbc(int x, int y, int width, int height, double wx,
			double wy, int anchor, boolean fill) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.weightx= wx;
		gbc.weighty = wy;
		gbc.anchor = anchor;
		gbc.insets = new Insets(2, 2, 2, 2);
	
		if (fill)
			gbc.fill = GridBagConstraints.BOTH;
		else
			gbc.fill = GridBagConstraints.NONE;
		return gbc;
	}
Mein Problem ist das folgende: Eigentlich erwarte ich dass mein textPanel ein Drittel der Höhe einnimmt wie mein zeichenPanel und mein arbeitsPanel. (gbc.weighty ist beim textPanel 5, bei den anderen 2 Paneln 15.)
Das passt auch anfangs so ungefähr. Aber je nachdem, was ich in meine Panels einfüge, verändert sich dieses Verhältnis!?!?
Meinem Textpanel wird während des Programmverlaufs jeweils eine JEditorPane mit unterschiedlichem html-Text zugefügt, auf meinem zeichenPanel und arbeitsPanel diverse Zeichnungn vollführt.
Hat jemand eine Ahnung, warum sich die Größenverhältnisse ändern? Ich dachte, die sollten unabhängig davon sein, was eingefügt wird. Zum Teil wächst aber das textpanel auf fast die gesamte Seitenhöhe an, während auf meinem ZeichenPanel die Zeichnungen gequetscht werden.
Für 'nen Tip, wär ich dankbar.
 

Ebenius

Top Contributor
Das GridBagLayout richtet sich immer nach der PreferredSize der Komponenten, es sei denn, das Panel ist zu klein (entweder zu wenig hoch oder zu wenig breit oder beides) als dass alle mit PreferredSize drauf passen. In dem Fall nimmt das GridBagLayout die MinimumSize der Komponenten. Das Gewicht bestimmt, in welchem Maßstab die Komponenten sich bzgl. der PrefferedSize (oder MinimumSize) vergrößern, wenn das Panel größer wird.

Ein Beispiel: Ein JLabel 1 hat den Text "Hallo", ein zweites JLabel 2 hat den Text "Ich bin ein JLabel". Beide JLabels liegen mit gleichem Gewicht 1.0 nebeneinander auf einem JPanel mit GridBagLayout. Das JLabel 1 möchte gern 100px breit sein, das JLabel 2 möchte gern 200px breit sein, das JPanel ist 300px breit. Beide JLabels haben genau ihre Lieblingsgröße. Vergrößert sich nun das JPanel auf das Doppelte seiner Größe (600px), dann vergrößert sich das erste JLabel auf 200px und das zweite JLabel auf 400px. Setzt man nun das Gewicht des zeiten JLabels auf 3.0, dann haben bei 300px JPanel-Breite die JLabels wie oben 100px und 200px, bei 600px JPanel-Breite hat des erste JLabel nun aber eine Breite von 150px und das zweite eine Breite von 450px.

Verkleinert man das Panel aber auf 200px, dann interessieren die PreferredSizes nicht mehr (denn die passen ja nicht mehr auf's JPanel). Dann werden die MinimumSizes genommen ─ ich erfinde bei beiden JLabels 10px. Dann wird das erste JLabel 50px breit und das zweite JLabel 150px breit sein.

Jetzt ändern wir die Größe des JPanels auf 300px. Alles wird in Lieblingsgröße angezeigt. Und nun ändern wir den Text des ersten JLabels auf "Ich bin jetzt länger". Schon passen nicht mehr beide Komponenten auf das JPanel. Und schon wird wieder die MinimumSize genommen.

Genau des selbe passiert in dem oben bezeichneten Beispiel. Ändert sich der Inhalt einer JTextArea, dann ändert sich auch seine PreferredSize. Und schon sieht das Layout komisch aus.

Lösungsvorschläge: Man kann alle PreferredSizes und MinimumSizes auf feste Werte setzen. Oder man kann auf die Spalte/Zeile -1 (Zelle -1×-1 nicht vergessen) Platzhalter in der richtigen Größe setzen (mit Box.createRigidArea() oder sowas) und bei allen anderen Komponenten weightx und weighty auf 0.0 setzen. Oder man nimmt ein anderes Layout?

Viel Erfolg in jedem Fall,
Ebenius
 
Zuletzt bearbeitet:
Hallo Ebenius,
ich glaube, ich habe das erste Mal die Wirkungsweise des GridBagLayout-Mangers verstanden. :D Warum steht das in keinem Java-Buch so drin?
Mal schauen, wie ich das jetzt umsetze.
Ich denk, ich werde die MinimumSize- und PreferredSize Werte auf fest vorgegebene Werte einstellen und dann mal schauen.
Danke für die konstruktive Antwort.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Swing GridBagLayout in Größe anpassen AWT, Swing, JavaFX & SWT 6
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
A Swing GridBagLayout - constraints.anchor scheint nicht korrekt zu funktionieren? AWT, Swing, JavaFX & SWT 7
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


Oben