# GridBagLayout Contraints



## vannelle (28. Jan 2010)

Hallo zusammen,

Ich versuche gerade ein Menü aus JButtons mittels dem GridBagLayout Manager linksbündig zu formatieren, aber mein JPanel das das Menü beinhaltet sowie der Inhalt der Buttons selbst ist immer zentriert, und nicht linksbündig. BEIDES soll linksbündig sein, die Buttonreihe linksbündig an der Contentpane und der Inhalt der Buttons (Icon/Text) linksbündig am Button.


Das ist der Codeauschnitt der die Probleme beinhaltet:

```
public Nonomat() {

		maincontent = new JFrame("Nonomat2000");
		GridBagLayout gbl = new GridBagLayout();
		
		JComponent menu = new JPanel();
		menu.setLayout(gbl);
		menu.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
		menu.setOpaque(true);
		menu.setPreferredSize(new Dimension(200,450));

		ImageIcon game = new ImageIcon("images/replay1.png");
		addComponent(menu,gbl,new JButton("Neu anfangen", game),0,0,1,1,0,0);

		ImageIcon open = new ImageIcon("images/open1.png");
		addComponent(menu,gbl,new JButton("Spiel laden", open),0,10,1,1,0,0);

		ImageIcon save = new ImageIcon("images/save1.png");
		addComponent(menu,gbl,new JButton("Spiel speichern", save),0,20,1,1,0,0);

		ImageIcon control = new ImageIcon("images/control1.png");
		addComponent(menu,gbl,new JButton("Lösung kontrollieren", control),0,30,1,1,0,0);

		ImageIcon show = new ImageIcon("images/show1.png");
		addComponent(menu,gbl,new JButton("Lösung anzeigen", show),0,40,1,1,0,0);

		ImageIcon zoomin = new ImageIcon("images/zoomin1.png");
		addComponent(menu,gbl,new JButton("Zoom In", zoomin),0,50,1,1,0,0);

		ImageIcon zoomout = new ImageIcon("images/zoomout1.png");
		addComponent(menu,gbl,new JButton("Zoom Out", zoomout),0,60,1,1,0,0);

		ImageIcon info = new ImageIcon("images/info1.png");
		addComponent(menu,gbl,new JButton("Info", info),0,70,0,0,0,0);
		
		maincontent.add(menu);
		maincontent.setLocation(100, 100);
		maincontent.setPreferredSize(new Dimension(600,450));
		maincontent.setVisible(true);
		maincontent.pack();
	}

	static void addComponent(Container menu, 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;
		gbc.anchor = GridBagConstraints.WEST; // <------ das sollte doch eig. das Problem beheben, tut es aber nich 
		gbl.setConstraints(c, gbc);
		menu.add(c);
	}
```

Ich hoffe ihr könnt mir weiterhelfen.
Zur Info: setze mich zum ersten mal intensiv mit der GUI-Programmierung auseinander (Uni).

lg
Vannelle


----------



## Ebenius (28. Jan 2010)

Probier mal: [java=46]gbc.fill = GridBagConstraints.VERTICAL;[/code]
... und [c]weightx[/c] für alle Buttons auf [c]1.[/c] setzen.

Sie Ausrichtung des Button-Inhalts setzt Du mit myButton.setHorizontalAlignment(int).

Ebenius


----------



## vannelle (28. Jan 2010)

durch das

```
gbc.fill = GridBagConstraints.VERTICAL;
```
ist es jetzt zwar linksbündig, allerdings wird nicht die gesamte Breite benutzt,
trotz 
	
	
	
	





```
weightx
```
 für alle Buttons auf 
	
	
	
	





```
1.
```
 setzen.


----------



## SlaterB (28. Jan 2010)

gesamte Breite geht doch kaum ohne HORIZONTAL oder alternativ BOTH wie du es früher hattest,
das schon zusammen mit dem neuen weightx ausprobiert?


----------



## vannelle (28. Jan 2010)

Ahh ... HORIZONTAL zusammen mit weightx funktioniert.
Allerdings steht gleich das nächste damit zusammenhängende Problem vor der Tür:

Die Buttons werden seltsam breit, obwohl das Panel das das Menü beinhaltet so definiert ist:

```
menu.setPreferredSize(new Dimension(100,477));
```

Wenn ich die Höhe änder, ändert sich auch die Höhe des Menüs, allerdings wenn ich die Breite änder gibt es keine Reaktion.


----------



## vannelle (28. Jan 2010)

das Problem hab ich grade selbst folgendermaßen gelöst:
Ich hab einen 2ten GridBagLayout Manager geschrieben welcher den JFrame mit dem Maincontent verwaltet.


```
static void addMain(Container maincontent, GridBagLayout gblm, Component c,int x, int y, int width, int height, double weightx, double weighty) {
		GridBagConstraints gbcm = new GridBagConstraints();
		gbcm.fill = GridBagConstraints.VERTICAL;
		gbcm.anchor = GridBagConstraints.WEST;
		gbcm.gridx = x;
		gbcm.gridy = y;
		gbcm.gridwidth = width;
		gbcm.gridheight = height;
		gbcm.weightx = weightx;
		gbcm.weighty = weighty;
		gblm.setConstraints(c, gbcm);
		maincontent.add(c);
	}
```

Hier dann 
	
	
	
	





```
gbcm.fill = GridBagConstraints.VERTICAL;
```
 gesetzt und alles passt.

Danke für die Hilfe!

lg
Vannelle


----------



## vannelle (2. Feb 2010)

Aufgrund einiger Layoutprobleme musste ich ein gesamtes Layout meines Programms überarbeiten,
und habe wieder Probleme mit dem GridBagLayout Manager.

Ich hab das hier schon durchgelesen und ausprobiert, allerdings bekomm ich es nicht hin.

Hier eine Skizze zur Veranschaulichung was wie am Ende angeordnet sein soll:






Erste Frage:
muss ich 2 unterschiedliche GridBagConstraints benutzen, also

```
GridBagConstraints c = new GridBagConstraints();
GridBagConstraints c1 = new GridBagConstraints();
```
 ?

also GridBagConstaints c für die Anordnung von Menü und Scrollpane im Maincontent, und
GridBagConstraints c1 für die Anordnung der einzelnen Komponenten in der ScrollPane?

im Moment sieht es so aus:

```
maincontent = new JFrame("Title");
maincontent.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
GridBagConstraints c1 = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.FIRST_LINE_START;

menu = new JPanel();
menu.setLayout(new GridBagLayout());
c.gridx = 0;
c.gridy = 0;
menu.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
maincontent.add(menu, c);

Scrollpane = new JPanel();
c.gridx = 1;
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0;

platzhalter = new JPanel();
platzhalter.setPreferredSize(new Dimension(x,y));
Scrollpane.add(platzhalter, c); // hier c1?

horizontalBar = new JPanel();
horizontalBar.setPreferredSize(new Dimension(x,y));
Scrollpane.add(horizontalBar, c); // hier c1?

verticalBar = new JPanel();
verticalBar.setPreferredSize(new Dimension(x,y));
Scrollpane.add(verticalBar, c); // hier c1?

Inhalt = new JPanel();
Inhalt.setPreferredSize(new Dimension(x,y));
Scrollpane.add(Inhalt, c); // hier c1?

scroll = new JScrollPane(Scrollpane);
maincontent.add(scroll,c);
```

Die Anordnung von Menü und Scrollpane stimmt, aber den Inhalt der Scrollpane, also verticalBar/horizontalBar/Platzhalter/Inhalt bekomm ich einfach nicht richtig gelayoutet.

Den Platzhalter habe ich eingefügt, weil verticalBar, horizontalBar und Inhalt zoombar sind, die Größe
des Platzhalters sich dann dynamisch berechnet und somit das die Bars noch richtig angeordnet über/am Inhalt liegen sollen.

Ich komm jetzt auch nicht wirklich auf die Werte für die einzelnen c/c1?.gridx , c/c1?.gridy etc.
Hab das schon nahe an dem oben im Link gezeigten Button-Layout versucht, aber bekomms nicht hin.


Grüße
Vannelle


----------



## Firestorm87 (2. Feb 2010)

Kann das sein, dass du die positionen (also z.B c.gridx und c.gridy) auch nirgens anpasst?
Woher soll der denn nun wissen was wo liegt, nur weil du beim content.add(Component, c) das Contraints-Objekt mit übergibst, ohne genauere Positionsangaben anzugeben?


----------



## vannelle (2. Feb 2010)

Ich hab das schon mit diversen Werten ausprobiert ala

```
platzhalter = new JPanel();
platzhalter.setPreferredSize(new Dimension(x,y))
c.weightx = 0.5
c.gridx = 1
c.gridy = 0
Scrollpane.add(platzhalter, c);
.
.
.
```

nahe an dem Buttonbeispiel aus dem Link


----------



## vannelle (2. Feb 2010)

hier mit den Werten die ich versucht habe:

```
maincontent = new JFrame("Title");
maincontent.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
GridBagConstraints c1 = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.FIRST_LINE_START;
 
menu = new JPanel();
menu.setLayout(new GridBagLayout());
c.gridx = 0;
c.gridy = 0;
menu.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
maincontent.add(menu, c);
 
Scrollpane = new JPanel();
c.gridx = 1;
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0;
 
platzhalter = new JPanel();
platzhalter.setPreferredSize(new Dimension(x,y));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
Scrollpane.add(platzhalter, c); // hier c1?
 
horizontalBar = new JPanel();
horizontalBar.setPreferredSize(new Dimension(x,y));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 0;
Scrollpane.add(horizontalBar, c); // hier c1?
 
verticalBar = new JPanel();
verticalBar.setPreferredSize(new Dimension(x,y));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 1;
Scrollpane.add(verticalBar, c); // hier c1?
 
Inhalt = new JPanel();
Inhalt.setPreferredSize(new Dimension(x,y));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 1;
Scrollpane.add(Inhalt, c); // hier c1?
 
scroll = new JScrollPane(Scrollpane);
maincontent.add(scroll,c);
```


----------



## Firestorm87 (2. Feb 2010)

[EDIT]: Du hast scheinbar stets das "setLayout(new GridBagLayout());" vergessen  Um überhaupt vom Default BorderLayout abzuweichen... Wobei Ich das GridBagLayout eh.. naja... oft vermeide [/EDIT]

Dann versuch mal dies 
Sieht fast aus wie deine Grafik von Oben 

```
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class MainFrame extends JFrame {
	public static void main(final String[] agrs) {
		new MainFrame();
	}

	public MainFrame() {
		this.setSize(800, 600);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLayout(new GridBagLayout());
		final GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;

		//Positionen innerhalb des MainFrame
		gbc.gridx = 0;
		gbc.gridy = 0;
		this.add(this.getPaneMenue(), gbc);

		gbc.gridx++;
		gbc.weightx = 1;
		gbc.weighty = 1;
		this.add(this.getScrollPane(), gbc);

		this.setVisible(true);
	}

	private Component getPaneFiller() {
		final JPanel pane = new JPanel();
		pane.setBorder(new LineBorder(Color.YELLOW));
		pane.add(new JLabel("Filler"));
		return pane;
	}

	private Component getPaneHorizintalBar() {
		final JPanel pane = new JPanel();
		pane.setBorder(new LineBorder(Color.ORANGE));
		pane.add(new JLabel("Horizontal"));
		return pane;
	}

	private Component getPaneInhalt() {
		final JPanel pane = new JPanel();
		pane.setBorder(new LineBorder(Color.PINK));
		pane.add(new JLabel("Inhalt"));
		return pane;
	}

	private Component getPaneMenue() {
		final JPanel pane = new JPanel();
		pane.setBorder(new LineBorder(Color.GREEN));
		pane.add(new JLabel("Menü"));
		return pane;
	}

	private Component getPaneVerticalBar() {
		final JPanel pane = new JPanel();
		pane.setBorder(new LineBorder(Color.BLUE));
		pane.add(new JLabel("Vertical"));
		return pane;
	}

	private Component getScrollPane() {
		final JScrollPane scrollPane = new JScrollPane();
		final JPanel pane = new JPanel();
		pane.setBorder(new LineBorder(Color.BLACK));
		pane.setLayout(new GridBagLayout());
		final GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;

		//Positionen innerhalb des ScrollPane
		gbc.gridx = 0;
		gbc.gridy = 0;
		pane.add(this.getPaneFiller(), gbc);

		gbc.gridx = 0;
		gbc.gridy = 1;
		pane.add(this.getPaneHorizintalBar(), gbc);

		gbc.gridx = 1;
		gbc.gridy = 0;
		pane.add(this.getPaneVerticalBar(), gbc);

		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.weightx = 1;
		gbc.weighty = 1;
		pane.add(this.getPaneInhalt(), gbc);

		scrollPane.setViewportView(pane);
		return scrollPane;
	}
}
```


----------



## vannelle (2. Feb 2010)

Danke, hat mir SEHR weitergeholfen.
Allerdings ist der Inhalt der "Inhaltspane" nach rechts unten ausgerichtet, und er sollte sich nach links oben ausrichten.


```
private Component getPaneInhalt() {
        final JPanel raster = new Raster();
/*Dachte das geht so:
        raster.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
*/
        raster.addMouseListener((MouseListener)raster);
        raster.setBorder(new LineBorder(Color.PINK));
        return raster;
    }
```

Aber da hab ich wohl wieder was falsch vemurkst^^


----------



## Firestorm87 (2. Feb 2010)

Der Inhalt ist zentriert / top ausgerichtet....

und das sollte auch bei dir so sein (sieht man ja am label) wenn du mein code ausführst....
Außerdem gings dir nur um die Panel-Anordnung... wo da nachher der Inhalt drin steht ist ja noch wieder ne neue geschichte, die sich aber ja genau so verhält wie in einem einfachen fenster auch...


----------



## vannelle (2. Feb 2010)

Ahh, danke nochmal für die Hilfe.
Das Problem hatte einen anderen Ursprung, da ich bevor ich das Layout verändert habe
den Startpunkt des Inhalts verändert hatte. 

Hat sich alles erledigt, danke nochmal!!


----------

