# Null-Layout - Wie geht es ohne?



## ehlr (27. Dez 2011)

Hallo.

Bisher habe ich GUIs mit 

```
Button.setBounds(100,100, 100, 25);
frame.getContentPane().add(Button);
```
etc. geschrieben.

Wie geht es, wenn man einen Layouter anstatt 
	
	
	
	





```
this.getContentPane().setLayout(null);
```
  verwendet?
Ich habe schon irgendwas mit
	
	
	
	





```
x.setBounds.YAchse
```
 oder so gehört.


lg


----------



## Marco13 (27. Dez 2011)

Schon sowas wie Lesson: Laying Out Components Within a Container (The Java™ Tutorials > Creating a GUI With JFC/Swing) durchgeschaut?


----------



## L-ectron-X (27. Dez 2011)

Schau mal in die FAQ, da sind schon einige Kurztutorials zu verschiedenen Layoutmanagern eingebaut.


----------



## ehlr (27. Dez 2011)

Ist das noch Up-To-Date ?

Java: Null Layout is Evil


```
import java.awt.FlowLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;


public class GUI {

	JPanel panel = new JPanel();
	
	public GUI() {
		panel.setLayout(new FlowLayout());
		this.initWindow();
		panel.setVisible(true);
	}
	
	private void initWindow() {
		panel.add(new JLabel("Close"));
		this.setContentPane(panel);
		this.pack();
		
	}
	
}
```



```
setContentPane(panel);
```
und

```
this.pack();
```


werden unterkringelt???


----------



## Fab1 (27. Dez 2011)

lass mal von JFrame erben, dann sollte es gehen.


----------



## ehlr (27. Dez 2011)

hehe, ist mir gerade auch eingefallen.


```
public class GUI extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	JPanel panel = new JPanel();
	
	public GUI() {
		panel.setLayout(new FlowLayout());
		this.initWindow();
		this.setVisible(true);
		this.setSize(400,400);
		this.setTitle("Test-Frame");
	}
	
	private void initWindow() {
		panel.add(new JLabel("Test"));
		panel.add(new JLabel("Test2"));
		panel.add(new JButton("Close"));
		this.setContentPane(panel);
		this.pack();
		
	}

	
	
}
```


Es wird ja alles nebeneinander angezeigt.
Wie positioniere ich es jetzt?


----------



## Fab1 (27. Dez 2011)

der Layoutmanager übernimmt das eigentlich für dich. Panel hat übrigens FlowLayout als Standardmanager somit musst du diesen nicht erst setzen.


----------



## NintendoLink07 (27. Dez 2011)

Fab1 hat gesagt.:


> der Layoutmanager übernimmt das eigentlich für dich. Panel hat übrigens FlowLayout als Standardmanager somit musst du diesen nicht erst setzen.



Es geht hier ja um das Null-Layout.

An den TE:

setLocation(int x, int y) legt Position X/Y fest.
setBounds(int x1, int y2, int x2, int y2) legt Position X/Y + Größe X/Y fest.


----------



## Fab1 (28. Dez 2011)

NintendoLink07 hat gesagt.:


> Es geht hier ja um das Null-Layout.
> 
> An den TE:
> 
> ...



das war mir durchaus bewusst, nur wird das Layout nirgends auf null gesetzt, somit kommt er damit nicht weit.

Um das zu machen, musst du das Layout der entsprechenden Komponenten auf null setzen. Zum Beispiel bei dem Panel

```
panel.setLayout(null)
```

Jetzt kannst du mit setBounds arbeiten. Aber nur in dem Panel!!!


----------



## L-ectron-X (28. Dez 2011)

Ich habe den TO in seinem Eingangspost so verstanden, dass er eigentlich gar nicht das "NullLayout" benutzen möchte...


----------



## Fab1 (28. Dez 2011)

L-ectron-X hat gesagt.:


> Ich habe den TO in seinem Eingangspost so verstanden, dass er eigentlich gar nicht das "NullLayout" benutzen möchte...



Stimmt, da hast du recht. Ich hab mich mehr auf den Titel des Threads fixiert und der hört sich nach null Layout an


----------



## NintendoLink07 (28. Dez 2011)

L-ectron-X hat gesagt.:


> Ich habe den TO in seinem Eingangspost so verstanden, dass er eigentlich gar nicht das "NullLayout" benutzen möchte...



Oh sorry, da hab' ich mal wieder zu schnell gelesen.


----------



## ehlr (28. Dez 2011)

Entschuldigt mich, ich habe mich unpassend ausgedrückt 

Ich habe jetzt diesen Code :


```
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


@SuppressWarnings("serial")
public class GUI extends JFrame {
	
	private JPanel panel = new JPanel();
	private JLabel helloWorld = new JLabel("Hello World");
	private JButton closeButton = new JButton("Close");
	
	public GUI() {
		panel.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.initWindow();
		this.setSize(200,200);
		this.setTitle("Hello World");
		this.setResizable(false);
		this.setVisible(true);
	}

	public void initWindow() {
		panel.add(helloWorld);
		panel.add(closeButton);
		this.setContentPane(panel);
		this.pack();
		
		closeButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0)  {
				System.exit(0);
			}
		});
	}
}
```


Es soll das Label (helloWorld) und darunter den Button (closeButton) anzeigen.
Beide Komponenten werden waagerecht nebeneinander dargstellt.
Wie kann ich den Button z.B. unter das Label setzten?


----------



## Fab1 (28. Dez 2011)

Das Flowlayout setzt die Komponenten immer nebeneinander solange Platz ist. Also entweder machst du den Platz, also den JFrame kleiner oder du nutzt zum Beispiel das BoxLayout, dieses setzt die Komponenten untereinander in deinem Beispiel muss nur die eine Zeile abgeändert werden.


```
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS ));
```


----------



## vanny (28. Dez 2011)

Also zunächst finde ich den Titel amüsand "Null-Layout - Wie geht es ohne?"

So, wenn du also nicht ohne Layout, also nicht mit Null-Layout arbeiten möchtest, wirst du mit nur einem Layoutmanager meist nicht das gewünschte Resultat erhalten.

Es ist ratsam, sich zumind. einen groben Eindruck über die verschiedenen Layoutmanager zu verschaffen und dann die Komponenten mit den jeweils geeigneten Managern zu verschachteln.

Mach einfach mal ein paar trockenübungen mit Buttons und farbigen Panels, dann haste das ganz schnell gerafft.

Gruß Vanny


----------



## ehlr (8. Jan 2012)

Ich bekomme das BorderLayout einfach nicht hin.
Kann bitte jemand ein einfaches Label auf Center setzen?


```
public class BorderLayoutTest  {
	

	
}
```


----------



## turtle (8. Jan 2012)

Das Verschachteln verschiedener Layout scheint ja zum "normalen" Gebrauch bei Swing-Anwendungen zu gehören.

Ich nehme IMMER den jgoodies Forms-Layoutmanager von Karsten Lentzsch.

Dabei verwende ich häufig den Abeille GUI-Builder, oder den WindowBuilder in Eclipse/Indigo. Damit artet das Erstellen einer GUI nicht im verzweifelten Schachteln von Border/Flow/Gridbag-Layout, aber es wird doch sehr minimiert.


----------



## jgh (8. Jan 2012)

mmmh:


```
JFrame f = new JFrame("Zufallszahlen");
		f.setSize(300, 300);
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JLabel l = new JLabel("Label, mittig zentriert!");
		l.setHorizontalAlignment(JLabel.CENTER);
		f.add(l);
		f.setVisible(true);
```


----------



## dehlen (8. Jan 2012)

Klar hier :


```
import java.awt.BorderLayout;

import javax.swing.BorderFactory;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JLabel;

import javax.swing.SwingUtilities;



public class Demo 

{

   private static void createGUI()

   {


      JFrame frame = new JFrame ("Test");
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
      frame.setLayout (new BorderLayout());

      JPanel centerPanel = new JPanel();
      centerPanel.setBorder (BorderFactory.createEtchedBorder());
      
      JLabel label = new JLabel ("Test");
      
      centerPanel.add(label);
      frame.add (centerPanel, BorderLayout.CENTER);

      frame.setSize (410, 200);
      frame.setVisible (true);

   }



   public static void main (String[] args)

   {


      SwingUtilities.invokeLater (new Runnable()

      {

         public void run()

         {

            createGUI();

         }

      });

   }

}
```

Du musst eben schauen je nachdem wie deine Gui ausschauen soll musst du den passenden LayoutManager nehmen. Du kannst auch z.B dem Frame ein BorderLayout geben und im Frame liegt ein JPanel mit z.B einem FlowLayout... So lässt sich eigentlich jede Gui realisieren.

PS: Das Label erscheint nun nicht in der Mitte weil im Norden, Süden ,Westen und Osten keine anderen Komponenten liegen. Daher nimmt Center das ganze Fenster ein und das Label erscheint oben. Vom Prinzip her würde es aber so gehen


----------



## jgh (8. Jan 2012)

dehlen hat gesagt.:


> PS: Das Label erscheint nun nicht in der Mitte weil im Norden, Süden ,Westen und Osten keine anderen Komponenten liegen. Daher nimmt Center das ganze Fenster ein und das Label erscheint oben. Vom Prinzip her würde es aber so gehen



Das ist Quatsch...zumindest teilweise! Der Grund warum das Label oben angezeigt ist, liegt im FlowLayout des 
	
	
	
	





```
JPanel center
```
, das per Default das FlowLayout gesetzt hat und das beginnt nunmal oben links.


----------

