# FlowLayout Alignment?!



## mavinatic (27. Jul 2011)

Hallo Community,

ich habe ein Problem und zwar benutze ich ein FlowLayout und ein paar JButtons mit denen ich ein JTabbedPane nachbaue! Mein Problem ist ich möchte meine JButtons GANZ links am Rand des Programmes haben und möchte das der Abstand 0 ist aber irgendwie habe ich da noch lücken und weiß nicht wie ich sie ändern kann.








Wie bekomme ich diese Lücken weg? FlowLayout flow = new FlowLayout(FlowLayout.LEFT,0,0) ist eingestellt.

Gruß

George


----------



## Monaria (27. Jul 2011)

Hast du vllt etwas Code oder mehr Infos?
Denn wenn ich einfach dein flow als Layoutmanager setze und Buttons zur ContentPane hinzufüge, dann sehe ich keine Lücken.


----------



## Camino (27. Jul 2011)

Könnte auch evtl. was mit den L&F zu tun haben.
Bei Nimbus hab ich z.B. einen Rand/Abstand um die Buttons, bei 
	
	
	
	





```
UIManager.getSystemLookAndFeelClassName()
```
 ist kein Abstand und die Buttons liegen direkt nebeneinander.


----------



## mavinatic (28. Jul 2011)

Hier ist einwenig Quelltext dort wo ich das Layout setze, kennt ihr ne Möglichkeit die Lücken zu schließen?

```
@Override
	public JPanel getUnderFunctionPanel() {
		// TODO Auto-generated method stub
		JPanel panel = new JPanel();
		panel.setBackground(new Color(119,136,153));
		panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0,0));
		
		for(int i=0;i<button.length;i++) {
			if(buttonLabel[i].equals("|")) {
				button[i] = new JButton();
				button[i].setBackground(Color.white);
				button[i].setPreferredSize(new Dimension(10,70));
				panel.add(button[i]);
			} else {
				button[i] = new JButton(buttonLabel[i]);
				button[i].setPreferredSize(new Dimension(70,70));
				button[i].setToolTipText(buttonLabel[i]);
				panel.add(button[i]);
			}			
		}
		return panel;
	}
```


----------



## jgh (28. Jul 2011)

Das hilft imho alles nicht viel...wie du am Bsp da unten erkennen könntest, macht sowohl deine Methode [c]getUnderFunctionPanel()[/c], als auch meine kurz implementierte Methode, genau das...was du willst.
Egal wie du den JFrame veränderst oder verschiebst...er packt die JButtons ganz nach links und füllt dann einfach auf.

Dein Problem wird nicht in diesem Panel liegen, sondern wahrscheinlich im Layout des Panels/Frames in dem dein "UnderFunctionPanel" liegt.


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLayoutEx {
	JButton[] button = new JButton[100];

	public FlowLayoutEx() {
		JFrame f = new JFrame();
		f.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(300, 300);
		f.setExtendedState(JFrame.MAXIMIZED_BOTH);
		for (int i = 0; i < 200; i++) {
			JButton b = new JButton((i + 1) + ". Button");
			f.add(b);
		}
		//die For-Schleife komplett auskommentieren und die folgende Zeile einkommentieren!
		// f.add(getUnderFunctionPanel());
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new FlowLayoutEx();
	}

	public JPanel getUnderFunctionPanel() {
		// TODO Auto-generated method stub
		JPanel panel = new JPanel();
		panel.setBackground(new Color(119, 136, 153));
		panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));

		for (int i = 0; i < button.length; i++) {
			button[i] = new JButton();
			button[i].setBackground(Color.white);
			button[i].setPreferredSize(new Dimension(10, 70));
			panel.add(button[i]);
		}
		return panel;
	}
}
```


----------



## mavinatic (28. Jul 2011)

Hey ihrs, hier ist das darunter liegende Panel  Wenn euch der QUelltext hilft evtl.


```
package org.gk.dms.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingConstants;


public class MainPanel extends JPanel {
	private JPanel menuPanel = new JPanel();
	private JPanel contentPanel = null;
	private JPanel mainFunctionPanel = new JPanel();
	private JPanel underFunctionPanel = null;
	
	private String[] mainButtonLabels = new String[] { "Menu", "Archive", "Search", "Manage"};
	private JButton[] mainButtons = new JButton[mainButtonLabels.length];
	
	private MyButtonListener listener = new MyButtonListener(this);
	
	public MainPanel() {
		init();
		initMenuPanel();
		initContentPanel();
	}
	
	private void init() {
		this.setLayout(new BorderLayout());
	}

	private void initMenuPanel() {
		menuPanel.setPreferredSize(new Dimension(800,100));
		menuPanel.setLayout(new BorderLayout());
			/* MainFunctionPanel */
			mainFunctionPanel.setPreferredSize(new Dimension(800,30));
			mainFunctionPanel.setLayout(new FlowLayout(FlowLayout.LEFT,1,0));
			mainFunctionPanel.setBackground(new Color(51,153,255));
			for(int i=0;i<mainButtons.length;i++) {
				if(i==0) {
					mainButtons[i] = new JButton(mainButtonLabels[i]);
					mainButtons[i].setVerticalAlignment(SwingConstants.TOP);
					mainButtons[i].setPreferredSize(new Dimension(50,50));
					mainButtons[i].addActionListener(listener);
					mainFunctionPanel.add(mainButtons[i]);
				}else {
					mainButtons[i] = new JButton(mainButtonLabels[i]);
					mainButtons[i].setVerticalAlignment(SwingConstants.TOP);
					mainButtons[i].setPreferredSize(new Dimension(100,50));
					mainButtons[i].addActionListener(listener);
					mainFunctionPanel.add(mainButtons[i]);
				}
			}
		
				
			
			menuPanel.add(BorderLayout.NORTH, mainFunctionPanel);
			
			if(underFunctionPanel!=null) {
				menuPanel.add(BorderLayout.CENTER, underFunctionPanel);
			}
			
		this.add(BorderLayout.NORTH, menuPanel);
	}
	
	private void initContentPanel() {
		if(contentPanel!=null) {
			this.add(BorderLayout.CENTER, contentPanel);
		}
	}
	
	public void setUnderFunctionPanel(JPanel panel) {
		underFunctionPanel = panel;
		menuPanel.removeAll();
		mainFunctionPanel.removeAll();
		initMenuPanel();
		this.revalidate();
		this.repaint();
	}
	
	public void setContentPanel(JPanel panel) {
		if(contentPanel!=null) {
			contentPanel.removeAll();
		}
		contentPanel=panel;
		initContentPanel();
		this.revalidate();
		this.repaint();
	}
	
	
}
```


----------



## tuttle64 (28. Jul 2011)

In der Java Api Dokumentation FlowLayout (Java Platform SE 6) steht es auch klar und deutlich.


----------



## mavinatic (28. Jul 2011)

API habe ich mir schon angeguckt und mit setVGAB / set HGAB probiert, aber wie du siehst, siehts nach nichts aus  

Deswegen wende ich mich ja an euch 

mfg george


----------



## jgh (28. Jul 2011)

deine Ursprungsfrage lautete: 


_"Mein Problem ist ich möchte meine JButtons GANZ links am Rand des Programmes haben und möchte das der Abstand 0 ist aber irgendwie habe ich da noch lücken und weiß nicht wie ich sie ändern kann.
Wie bekomme ich diese Lücken weg?"_

Dein MainPanel in einem JFrame gepackt ergibt dieses Bild:



dein MainPanel in einem JFrame mit FlowLayout gepackt, ergibt das folgende Bild:



Die Buttons sind immer ganz links angeordnet...Problem gelöst 
selbst wenn du den JFrame einem JApplet addest, dürfte es genauso aussehen...!

[java=69]	private void initContentPanel() {
		if (contentPanel != null) {
			this.add(BorderLayout.CENTER, contentPanel);
		}
	}[/code]
in einer 
	
	
	
	





```
initContentPanel()
```
-Methode, erwarte ich (evtl. zu Unrecht?) dass das ContentPanel initialisiert wird, also sowas wie [c]contentPanel = getContentPanel()// new BlaBlaPanel() [/c] oder was auch immer, und nicht das es auf gegen null geprüft wird, und dann irgendwo geaddet wird.

genauso deine setUnderFunctionPanel()-Methode:

```
public void setUnderFunctionPanel(JPanel panel) {
		underFunctionPanel = panel;
		menuPanel.removeAll();
		mainFunctionPanel.removeAll();
		initMenuPanel();
		this.revalidate();
		this.repaint();
	}
```
Was für wilde Sachen machst du da....  in einer setXYZ Methode, erwarte ich (wahrscheinlich wieder zu Unrecht), dass dort XYZ gesetzt wird, und nicht in menuPanel und mainPanel alles removed wird, die initMenuPanel() aufgerufen wird, und das ganze Panel revalidated und repaint wird.

hier mal ein Bsp. wie man sowas machen könnte...

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ExampleJFrame {
	JFrame frame;
	JPanel mainPanel, menuPanel;

	public static void main(String[] args) {
		new ExampleJFrame();
	}

	public ExampleJFrame() {
		initFrame();
		initMenuPanel();
		initMainPanel();
		addingPanelsToFrame();
		frame.setVisible(true);
	}

	private void initFrame() {
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setSize(300, 300);
	}

	private void initMenuPanel() {
		menuPanel = new JPanel();
		menuPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		for (int i = 0; i < 5; i++) {
			JButton b = new JButton((i + 1) + ". Menu");
			if (i == 0) {
				b.setPreferredSize(new Dimension(200, 50));
			} else {
				b.setPreferredSize(new Dimension(100, 50));
			}

			menuPanel.add(b);
		}
	}

	private void initMainPanel() {
		mainPanel = new JPanel();
		mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		for (int i = 0; i < 20; i++) {
			JButton b = new JButton(i + "");
			b.setPreferredSize(new Dimension(100, 50));
			mainPanel.add(b);
		}
	}

	private void addingPanelsToFrame() {
		frame.add(menuPanel, BorderLayout.NORTH);
		frame.add(mainPanel, BorderLayout.CENTER);

	}
}
```


----------



## mavinatic (28. Jul 2011)

Ich habe die Methoden umgenannt  in upadatePanel... damit es besser klingt


----------

