LayoutManager GridBagLayout spielt verrückt

Luciferius

Mitglied
Folgendes Problem: Ich wollte mit dem GridBagLayoutManager mir ein Fenster aufbauen, wo ein Kästchen mit der unveränderbaren Größe 50*50 in der oberen rechten Ecke sitzt, welches von einem vertikalen und einem horizontalen Panel mit je fester Breite bzw. fester Höhe umgeben werden soll. Ich benutzte dazu die Hilfsfunktion aus dem Buch "Java ist auch eine Insel" (addComponent). es passiert nun folgendes: Das Kästchen ist alles andere als unveränderlich (beim ziehen des Fenster ändert sich ständig die Größe des Kästchens und auch das horizontale Kästchen will nicht so recht. Hier mal der Code dazu:
Java:
import java.awt.*;

import javax.swing.*;

class KSKB1 extends JFrame{
	
	public KSKB1(){
		GridBagLayout gbl = new GridBagLayout();
        JPanel mainPanel = new JPanel(gbl);
        this.setContentPane(mainPanel);
        this.setSize(400, 400);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        JLabel horizontal = new JLabel();
		horizontal.setBackground(Color.black);
		horizontal.setOpaque(true);
		horizontal.setPreferredSize(new Dimension(0,10));
		horizontal.setMaximumSize(horizontal.getPreferredSize());
		//									  x  y  b  h ax  ay
		addComponent(mainPanel,gbl,horizontal,0, 1, 2, 1,1.0,0);
		
		JLabel vertikal = new JLabel();
		vertikal.setBackground(Color.black);
		vertikal.setOpaque(true);
		vertikal.setPreferredSize(new Dimension(10,0));
		vertikal.setMaximumSize(vertikal.getPreferredSize());
		//									 x    y   b h ax  ay
		addComponent(mainPanel,gbl,vertikal, 1,   0,  1,1,0, 1.0);
		
		JPanel kästchen = new JPanel();
		kästchen.setBackground(Color.white);
		kästchen.setOpaque(true);
		kästchen.setPreferredSize(new Dimension(50,50));
		kästchen.setMaximumSize(kästchen.getPreferredSize());
		//									x y b h ax ay
		addComponent(mainPanel,gbl,kästchen,0,0,1,1,0 ,0 );
		
		JPanel lower = new JPanel(gbl);
		JPanel right = new JPanel(gbl);
		addComponent(mainPanel,gbl,lower,0,2,3,1,1.0,1.0);
		addComponent(mainPanel,gbl,right,2,0,1,2,1.0,1.0);
	}
	
	static void addComponent(Container cont, GridBagLayout gbl, Component c, int x, int y,
            int width, int height, double weightx, double weighty) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        gbl.setConstraints(c, gbc);
        cont.add(c);
    }
	
	public static void main(String... args) {
        KSKB1 kskb = new KSKB1();
        kskb.setVisible(true);
    }
}

Liebe Grüße,

Luciferius
 
Hallo Luciferius,

versuch's mal so:

Java:
//                                       x  y  b  h  wx  wy
addComponent(mainPanel, gbl, horizontal, 2, 1, 1, 1, 1.0, 0);

JLabel vertikal = new JLabel();
vertikal.setBackground(Color.black);
vertikal.setOpaque(true);
vertikal.setPreferredSize(new Dimension(10, 0));
vertikal.setMaximumSize(vertikal.getPreferredSize());
//                                     x  y  b h  wx  wy
addComponent(mainPanel, gbl, vertikal, 1, 2, 1, 1, 0, 1.0);

JPanel kästchen = new JPanel();
kästchen.setBackground(Color.white);
kästchen.setOpaque(true);
kästchen.setPreferredSize(new Dimension(50, 50));
kästchen.setMaximumSize(kästchen.getPreferredSize());
//                                     x  y  b  h wx wy
addComponent(mainPanel, gbl, kästchen, 1, 1, 1, 1, 0, 0);

JPanel lower = new JPanel(gbl);
JPanel right = new JPanel(gbl);
//                                  x  y  b  h  wx   wy
addComponent(mainPanel, gbl, lower, 1, 3, 3, 1, 1.0, 1.0);
addComponent(mainPanel, gbl, right, 3, 1, 1, 2, 1.0, 1.0);

Siehe auch: GridBagLayout - Byte-Welt Wiki

Gruß,
André
 
Danke für die Seite. Ich werde sie mir mal durchlesen, jedoch mein Problem ist damit immer noch nicht gelöst, da sich entweder die größe des Kästchens mitverändert oder die Größe der Ränder.
 
kästchen dehnt sich bei mir nicht aus, horizontal dehnt sich horizontal aus, vertikal dehnt sich vertikal aus. So hatte ich es auch verstanden, dass du es machen willst.
 

Anhänge

  • gbl.jpg
    gbl.jpg
    9,4 KB · Aufrufe: 29
Zuletzt bearbeitet:
Nein, ich will, dass oben rechts in der Ecke das unveränderliche Kästchen ist, umgeben von den Panels "horizontal" und "vertikal", welche genau an dem Kästchen sein sollen und deren Größe ebenfalls unveränderlich ist. Der Rest des "mainPanels" soll mit den Panels "lower" und "rigt" dynamisch ausgefüllt werden, also das nur die Beiden sich bei anpassen des Bldschirmgröße ändern, "kästchen", "horizontal" und "vertikal" jedoch ihre Größe beibehalten.
Ich habe auch schon versucht mit der gbc.fill Option rumzuspielen, dann entstehen aber ungewollte Zwischenräume.
 

Anhänge

  • neu.jpg
    neu.jpg
    9,6 KB · Aufrufe: 28
Feste Größen musst du auch fest programmieren.
Dazu rufst du die Methoden setPreferredSize(), setMinimumSize() und setMaximumSize() mit den gleichen Werten an den unveränderlichen Komponenten auf.
 
Java:
//                                       x  y  b  h  wx   wy
addComponent(mainPanel, gbl, horizontal, 0, 1, 2, 1, 0.0, 0.0);//<---------------
addComponent(mainPanel, gbl, vertikal,   1, 0, 1, 1, 0.0, 0.0);//<---------------
addComponent(mainPanel, gbl, kästchen,   0, 0, 1, 1, 0.0, 0.0);
addComponent(mainPanel, gbl, lower,      0, 2, 3, 1, 1.0, 1.0);
addComponent(mainPanel, gbl, right,      2, 0, 1, 2, 1.0, 0.0);//<---------------

Vor allem dürfen wir den Spalten und Zeilen, die ihre Größe nicht verändern sollen, auch kein Gewicht geben, also weightx=0.0 bei horizontal, weighty=0.0 bei vertikal und right 😉.

Gruß,
André
 

Anhänge

  • gbl.png
    gbl.png
    6,3 KB · Aufrufe: 27
Zuletzt bearbeitet:
wieso muss das Panel right in y-richtung kein Gewicht haben?

Der Layout-Manager setzt das Gewicht der Spalte / Zeile gleich dem maximalen Gewicht der Komponenten in dieser Spalte / Zeile (Siehe GridBagLayout - weightx, weighty).

Wenn demnach "right" zusätzlichen vertikalen Raum bekommen kann (mit weighty = 1.0), dann kann z.B. auch "horizontal" zusätzlichen vertikalen Raum erhalten, was wir ja vermeiden wollten. (Eigentlich erstreckt sich "right" über zwei Zeilen; der Layout-Manager muss demnach das Zeilengewicht einer der beiden Zeilen zuordnen und entscheidet sich anscheinend für die unterste Zeile, in der sich auch "horizontal befindet".)

Gruß,
Andre
 
Zuletzt bearbeitet:

Zurück
Oben