# jPanel frei platzieren



## mafu (16. Mrz 2006)

Hallo,

ich versuche ein JPanel für die Darstellung von Images frei auf einem JFrame zu platzieren, aber leider geht das so nicht.
Es wäre nett wenn mir hier jemand helfen könnte.

Ich versuche es so 


```
public static void main(String[] args) {
		
		JFrame gui= new JFrame();
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel jpan= new JPanel();
		gui.add(pan);
		jpan.setBounds(50,50,100,100);
		gui.setSize(500,500);
		gui.setBackground(Color.BLACK);

		gui.setVisible(true);
}
```


----------



## Leroy42 (16. Mrz 2006)

Das geht so nicht, weil die ContentPanes der JFrames defaultmäßig ein BorderLayout verwenden
und mit add ohne zusätzliche Angabe die Komponente im CENTNER-Bereich plaziert werden, d.h.
diese Komponente bekommt immer den gesamten verfügbaren Bereich zugewiesen, egal was
ihre Lieblingsgröße ist.

Du mußt das NullLayout verwenden; also vor deinem add-Aufruf:

```
gui.getContentPane().setLayout(null);
```


----------



## mafu (16. Mrz 2006)

Danke für die Antwort, aber leider geht es nicht.


public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame gui= new JFrame();
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel pan= new JPanel();

		gui.getContentPane().setLayout(null); 

		gui.add(pan);
		pan.setBounds(50,50,100,100);
		gui.setSize(500,500);
		gui.setBackground(Color.BLACK);

		gui.setVisible(true);
}


----------



## Leroy42 (16. Mrz 2006)

:shock: Stimmt!

Dann weiß ich es im Moment leider auch nicht, da ich selbst nie das
Null-Layout benutze.

Stell die Frage doch mal in _AWT, Swing & SWT_ Forum. Da dürften genug
Experten vorbeischauen und warte ein wenig.


----------



## tini (16. Mrz 2006)

```
public static void main(String[] args) { 
	JFrame gui= new JFrame(); 
	gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	gui.getContentPane().setLayout(null); 
		
	JPanel pan= new JPanel(); 
	pan.setBounds(50,50,100,100); 

	gui.getContentPane().add(pan); 
	gui.setSize(500,500); 
	gui.getContentPane().setBackground(Color.BLACK); 
		
         gui.setVisible(true); 
}
```

Das geht. Hast vergessen, dich IMMER aufs ContentPane zu beziehen.


----------



## Gast (16. Mrz 2006)

Wenn das Layout ein bisschen aufwendiger gestaltet werden solle, schreibe ich mir immer eine eigene Klasse in die ich die Klasse LayoutManager implementere. Hier kann man dann sehr schon mit absoluten und relativen Positionen arbeiten, ohne das bei Grössenänderung des Frame das ganze Layout zerschossen wird.


----------



## mafu (16. Mrz 2006)

Kannst du mir so ein Bsp. mal posten ? Bin noch totaler Anfänger.


----------



## Guest (16. Mrz 2006)

Hier mal ein schnell zusammengeschnippeltes Bsp.: Der JFrame enthält ein JLabel, welches egal wie man gross man ihn zieht immer in der Mitte bleibt.


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

public class OwnLayout extends JFrame implements LayoutManager {
    private JLabel label;

    public OwnLayout() {
        this.setBounds(0,0, 550, 200);
        this.getContentPane().setLayout(this);
        
        label = new JLabel("     Ich bin in der Mitte");
        label.setBounds(200, 75, 150, 50);
        label.setBorder(BorderFactory.createEtchedBorder());
        this.getContentPane().add(label);
    }

    //Methoden aus LayoutManager
    public void layoutContainer(Container c) {		
        int width = c.getBounds().width;
        int height = c.getBounds().height;
        
        label.setBounds((width - label.getBounds().width)/2, (height - label.getBounds().height)/2, 150, 50);
    }
	
    public void addLayoutComponent(String s, Component c) {}
    public Dimension preferredLayoutSize(Container c){return new Dimension(0, 0);}
    public Dimension minimumLayoutSize(Container c){return new Dimension(0, 0);}
    public void removeLayoutComponent(Component c) {}

    //main-Methode
    public static void main(String[] args) {
        OwnLayout ol = new OwnLayout();
        ol.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ol.show();
    }
}
```


----------



## mafu (17. Mrz 2006)

Danke das hilft mir sehr.


----------



## Ralf Ueberfuhr (17. Mrz 2006)

Wie ist es mit der einfachen Variante?

Anstelle
gui.add(pan);
einfach
gui.getContentPane().add(pan);

Dann könnte das auch mit dem NullLayout klappen. Die Position einfach per setBounds(...) bzw. setLocation(...) setzen.


----------

