# Layouts verschachteln



## Gubi (31. Aug 2004)

Hallo,

ich bin neu hier und habe ein Problem. Will einen Texteditor bauen. Habe ein GridLayout genommem um alles zu struktorieren. Jetzt will ich oben aber 3 Buttons einsetzten, es geht jedoch nur einer. Muss ich jetzt ein Layout in mein Gridlayout packen? Und wenn ja wie? Will jetzt keinen fertigen Quellcode, jedoch einen "Quellcode Beispiel" damit ich weiß wie es aussehen muss.

Über Antworten würde ich mich sehr freuen.


Greetz
Gubi


----------



## Anubis (31. Aug 2004)

Das geht ganz einfach. Erzeuge ein Panel() setzte in dem Panel das entsprechende Layout. Pake dort die Button rein. Und zuletzt packst du das Panel oben hin, wo die Button hin sollten.


----------



## Gubi (31. Aug 2004)

ok.

aber das ganze muss in das "North" Fenster von meinem GridLayout. Wie gehts das?


----------



## foobar (31. Aug 2004)

```
this.getContentPane().setlayout( new BorderLayout());
this.getContentPane().add(panel, Borderlayout.North);
```


----------



## Gubi (31. Aug 2004)

super danke


----------



## Gubi (31. Aug 2004)

vielleicht kann mir das mal einer an diesem beispiel hier zeigen, kriegs nicht hin...


```
SchachtelLayout() {
        super("Border");
        setSize(240, 280);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();
        pane.setLayout(new BorderLayout());
        pane.add("North", north);
        pane.add("South", south);
        pane.add("East", east);
        pane.add("West", west);
        pane.add("Center", center);
        setContentPane(pane);
```


----------



## foobar (31. Aug 2004)

```
import java.awt.*;
import java.awt.Container;
import javax.swing.*;

public class BorderLayoutDemo extends JFrame
{
	private JButton btnFoo, btnBar, btnBaz;
	private Container con;
	private JPanel pnlNorth, pnlCenter;
	public BorderLayoutDemo()
	{
		this.setSize(300, 300);
		this.createUI();
		this.setVisible(true);
	}
	
	private void createUI()
	{
		this.con 			= this.getContentPane();
		
		this.btnFoo 	= new JButton("foo");
		this.btnBar 	= new JButton("bar");
		this.btnBaz 	= new JButton("baz");
		
		this.pnlNorth 	= new JPanel();
		this.pnlNorth.setBackground(Color.RED);
		this.pnlCenter = new JPanel();
		this.pnlCenter.setBackground(Color.BLUE);
		
		this.pnlNorth.add(this.btnFoo);
		this.pnlNorth.add(this.btnBar);
		this.pnlNorth.add(this.btnBaz);
		
		this.con.add(pnlNorth, BorderLayout.NORTH);
		this.con.add(pnlCenter, BorderLayout.CENTER);
	}
	
	public static void main(String[] args)
	{
		new BorderLayoutDemo();
	}
}
```


----------



## Gubi (31. Aug 2004)

habs gemacht und auch selbst meine komponenten eingebunden. funktioniert.

vielen dank!!!


----------



## m!k3 (13. Sep 2004)

Wenn ich einen JFrame selber erzeuge krieg ich das Ganze einfach nicht hin  :? 


```
JFrame frame = new JFrame();
frame.setSize(430,155);
frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        
JTextField username     = new JTextField();
JTextField gender       = new JTextField();
JTextField birthday     = new JTextField();
JPasswordField password = new JPasswordField();
JTextArea info          = new JTextArea();
        
JLabel username_lab     = new JLabel("Username:");
JLabel gender_lab       = new JLabel("Gender:");
JLabel birthday_lab     = new JLabel("Birthday:");
JLabel password_lab     = new JLabel("Password");
JLabel info_lab         = new JLabel("Info");
        
Container con       = new Container();
JPanel northPanel   = new JPanel();
JPanel southPanel   = new JPanel();
        
northPanel.setLayout(null);
southPanel.setLayout(null);
        
username_lab.setBounds(5,10,100,25);
username.setBounds(110,10,100,25);
password_lab.setBounds(220,10,100,25);
password.setBounds(325,10,100,25);
gender_lab.setBounds(5,40,100,25);
gender.setBounds(110,40,100,25);
birthday_lab.setBounds(220,40,100,25);
birthday.setBounds(325,40,100,25);     
info_lab.setBounds(5,75,100,25);
info.setBounds(110,75,315,25);
        
northPanel.add(username_lab);
northPanel.add(username);
northPanel.add(password_lab);
northPanel.add(password);
northPanel.add(gender_lab);
northPanel.add(gender);
northPanel.add(birthday_lab);
northPanel.add(birthday);
        
southPanel.add(info_lab);
southPanel.add(info);
        
con.add(northPanel, BorderLayout.NORTH);
con.add(southPanel, BorderLayout.SOUTH);
        
frame.setTitle("Register 2 Chat");
frame.getContentPane().add( con );

//frame.pack();
//frame.show();
frame.setVisible(true);
```

Was mach ich denn falsch?! Keine einzige Komponente wird angezeigt.. nur ein leerer Frame  :bahnhof:

edit: Bitte keine Kommentare, was das Ganze noch für einen Sinn macht wenn ich überall kein Layout verwende @ JPanel's... war zuerst anders vorgesehn, und ich möchte trotzdem wissen wie das mit dem Container funktioniert...


----------



## Gast (16. Sep 2004)

kann mir den keiner da helfen.. ich find den Fehler nicht..


----------



## Griffin (16. Sep 2004)

Also da:


```
northPanel.setLayout(null);
southPanel.setLayout(null);
```

würd ich erstmal ein Layout reinhauen, vielleicht funktioniert es nicht ohne!?!?

Und hier hast du ein BorderLayout ohne es vorher zu definieren, zumindest nicht im sichtbaren Code:


```
con.add(northPanel, BorderLayout.NORTH);
con.add(southPanel, BorderLayout.SOUTH);
```

Aber da das Programm startet geh ich davon aus, dass das nicht der Fehler ist.

Probier mal ob das BorderLayout überhaupt richtig dargestellt wird
(ich bedien mich mal foobars idee  )


```
nortPanel.setBackground(Color.RED);
southPanel.setBackground(Color.BLUE);
```


P.S. bevor die keiner antwortet tu lieber ich das


----------



## Gast (16. Sep 2004)

ne.. hatte vorher schon BorderLayout drin... hat das im nachhinein geändert weil ich wissen wollt ob ohne nen Container wenigstens was dargestellt wird.. also nur ein Panel dem Frame zugewiesen..


----------



## m!k3 (18. Sep 2004)

btw.... das mit den Backgroundfarben geht nicht 

also irgendwie geht der Container nicht auf den Frame.. oder die Panels nicht auf den Container.. hab auch ein Layout nun zugewiesen den JPanels... funzt auch nicht 

also ich rede vom Beispiel siehe paar Einträge höher..


----------



## Guest (18. Sep 2004)

Ersetze

Container con = new Container();

durch

JPanel con = new JPanel();
con.setLayout(new BorderLayout());


----------



## m!k3 (18. Sep 2004)

```
/*
 * MyFrame.java
 *
 * Created on 18. September 2004, 22:52
 */
import java.awt.*;
import javax.swing.*;

/**
 *
 * @author  mike
 */
public class MyFrame extends JFrame {
    
    /** Creates a new instance of MyFrame */
    public MyFrame(){
        this.setSize(430,155); 
        this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); 

        JPanel contentPane  = new JPanel();
        JPanel northPanel   = new JPanel(); 
        JPanel southPanel   = new JPanel(); 

        contentPane.setLayout(new BorderLayout());
        northPanel.setLayout(new BorderLayout()); 
        southPanel.setLayout(new BorderLayout()); 

        northPanel.setBackground(Color.RED);
        southPanel.setBackground(Color.BLUE);
        contentPane.add(northPanel, BorderLayout.NORTH); 
        contentPane.add(southPanel, BorderLayout.SOUTH); 

        this.setTitle("Register 2 Chat"); 
        this.setContentPane( contentPane );

        //frame.pack(); 
        //frame.show(); 
        this.setVisible(true);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new MyFrame();
    }
    
}
```

bin wohl zu blöd dafür... hmmm...  :cry:


----------



## Guest (18. Sep 2004)

Die Panels, die Du erzeugst sind leer und haben zunächst mal keine 
Größe. BorderLayout bestimmt die Größe einer Komponente über
getPreferredSize()
Klartext: setPreferredSize(new Dimension(###, ###)); oder paar Komponente
in die Panels einfügen.
z.B.

```
JPanel northPanel   = new JPanel();
JPanel southPanel   = new JPanel();
northPanel.setPreferredSize(new Dimension(1,50));
southPanel.setPreferredSize(new Dimension(1,22));
```


----------



## Gast (18. Sep 2004)

oookeeee... sorryyy..  mein Fehler *g


----------



## Guest (18. Sep 2004)

Noch etwas gibt's bei BorderLayout.
Bei BorderLayout.NORTH und BorderLayout.SOUTH wird die Breite einer
Komponente ignoriert und die Komponente wird der Breite des übergeordneten
Containers angepasst.
Bei BorderLayout.EAST und BorderLayout.WEST wird wieder die Höhe ignoriert.
BorderLayout.CENTER zieht die Komponente auf die Größe des restlichen 
verfügbaren Platzes (horizontal und vertikal).


----------

