# Mehrere Container



## skopus (14. Mai 2008)

Hi,
ich hätt an dieser Stelle gleich zwei Fragen.
Ich gehe gerade ein Javamodul zum Thema Swing durch. AWT habe ich (hoffentlich ausreichend) hinter mir.

Den Aufbau eines Swing GUI habe ich so weit verstanden. Jetzt stellen sich mir folgende Fragen:
Kann ich mehrere Container nutzen? Z.B.

```
Container top = getContentPane();
top.setBounds(x,y,x,y);

Container Bottom = getContentPane();
bottom.setBounds(a,b,a,b)
```

Hatte probiert damit zwei Flächen zu erhalten, wo ich zB unterschiedliche Layoutmanager nutzen kann. Aber es war immer nur ein Container zu sehen. Eclipse bietet mir aber setBounds an  ???:L 

Meine Zweite Frage währe (hängt hier mitzusammen), wenn ich eine Klasse mit einer paint Methode aufrufe, wie diese dann in einem Swing GUI angezeigt werden kann, wenn ich 1. top.setLayout(null) oder 2. top.setLayout(new irgendein.Layout) setzen?

Danke


----------



## André Uhres (14. Mai 2008)

Natürlich kannst du zwei Container nutzen. Es müssen aber zwei verschiedene sein
(getContentPane() liefert immer denselben). Beispiel:

```
getContentPane().add(jPanel1, BorderLayout.NORTH);
getContentPane().add(jPanel2, BorderLayout.CENTER);
```
setBounds gilt in der Regel nur bei Nulllayout (meistens nicht empfohlen).
http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html


----------



## skopus (15. Mai 2008)

Hi André,
erst mal danke. Aber könntest du den Code in einen Zusammenhang bringen. Ich weiß jetzt zB nicht, was mit jPanel1 gemeint ist.


----------



## skopus (15. Mai 2008)

Hier mal ein Beispielcode von dem, was ich geschrieben habe:


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

public class Test extends JFrame{
    Container c;

    public test(){
        super("Fenstername");
        this.setVisible(true);
        this.setSize(500,300);
        
        Label l = new Label();
        c = getContentPane();
        c.setLayout(new FlowLayout());                <---Layout    
        c.add(l);
    }

    public class Label extends JLabel{
        public void paintComponent(Graphics g){
            super.Component(g);
            g.drawString("hi",50,50);
        }
    }


    public static void main(String[] args){
        Test t = new Test();
    }
}
```

Würde ich jetzt das Layout auskommentieren, würde ich l angezeigt bekommen. Aber das Layout brauche ich. Allein wegen Elementen ala JButton oder JSlider.


----------



## Marco13 (15. Mai 2008)

Ungetestet

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

public class Test extends JFrame{
    Container c0;
    Container c1;

    public test(){
        super("Fenstername");
        this.setVisible(true);
        this.setSize(500,300);
        
        Label l = new Label();
        c = getContentPane();
        c.setLayout(new GridLayout(1,2));
        c0 = new JPanel(new FlowLayout());
        c1 = new JPanel(new FlowLayout());
        c.add(c0);
        c.add(c1);
        c0.add(l);
    }

    public class Label extends JLabel{
        public void paintContent(Graphics g){
            super.paintContent(g);
            g.drawString("hi",50,50)
        }
    }


    public static void main(String[] args){
        Test t = new Test();
    }
}
```


----------



## skopus (15. Mai 2008)

Hm... ne, das will auch nicht :-(


----------



## Marco13 (15. Mai 2008)

Will Polly vielleicht nen Keks?


----------



## André Uhres (15. Mai 2008)

Marco13 hat gesagt.:
			
		

> Will Polly vielleicht nen Keks?


Im Reformhaus gibt's welche, die sin ganz gesund und lecker   
Aber Spass beiseite. Schau mal hier rein:
http://java.sun.com/docs/books/tutorial/uiswing/layout/flow.html
_How to Use FlowLayout
...
    The FlowLayout class puts components in a row, sized at their *preferred size*._
In anderen Worten: l braucht eine PreferredSize:

```
l.setPreferredSize(new Dimension(100, 100));
```


----------



## Marco13 (15. Mai 2008)

Ein Label (zumindest ein JLabel, aber ein Label sicher auch) hat ein PreferredSize - nämlich so, dass der Text reinpasst. Aber ... das ist es ja, woraufs sich das mit dem Keks bezog: Keiner weiß, was eigentlich das Problem ist...  :roll:


----------



## skopus (15. Mai 2008)

Gut, das stimmt. Also es sieht so aus.
Ich mus für die FH ein Programm schreiben, zwingend in Swing, wo halt Buttons, Slider und auch Zwichnungen rein sollen.
Jetzt habe ich zwar ein schönes Modul, was ich durcharbeiten muss/kann, wo auch viele Beispiele drinn sind, aber keines, was mir dieses Problem näher beschreibt.
Ich will ja auch keine Fertiglösung, viel mehr ein Beispiel, anhand dessen ich den Aufbau besser Nachvollziehen kann.

Wenn ich kein Layoutmanager setze, dann tanzen mir die Slider auf der Nase rum. Weil diese sich ja nicht so locker per setBounds setzen lassen.

Ich ging jetzt halt davon aus, dass wenn ich zwei Container nutze, dem einen die Slider mit nem Layout zuordne und dem anderen ohne Layoutmanager die zeichnung, dass das dann so wunderbar klappt.


----------



## André Uhres (15. Mai 2008)

Marco13 hat gesagt.:
			
		

> Ein Label (zumindest ein JLabel, aber ein Label sicher auch) hat ein PreferredSize - nämlich so, dass der Text reinpasst.


Sein "Label" ist eine Erweiterung von JLabel und malt den Text selbst in paintComponent.
In dem Fall muss er auch selbst die PreferredSize setzen :wink:

EDIT: Viele Anwendungen nutzen das default Layout von JFrame: BorderLayout.
Sehr oft kommt dann eine JToolBar mit den Kontrollelementen nach BorderLayout.NORTH
und ein mainPanel (JPanel) nach BorderLayout.CENTER
Mein Link oben zeigt, wie die verschiedenen LayoutManager im Einzelnen funktionieren.


----------

