# JPanel an JFrame anpassen



## mapa (17. Mai 2011)

Hallo,

ich habe ein JFrame, dem ich ein JPanel mit add() hinzufüge. Ein Teil des Panel wird von der Titelleiste des JFrames überdeckt, hab versuch das ganze panel mit move() nach unten zu bewegen, klappt aber nich ???:L Kann ich den JPanel auch irgendwie anders ans JFrame anpassen???


```
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class Game extends JFrame{

	private static final long serialVersionUID = 291555648421589142L;
	
	Board board;
	
	public Game()
	{
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		
		board = new Board();
		add(board);
		board.move(5,20);
		
		this.setSize(board.width, board.height);
		setVisible(true);
	}
	
	public static void showErrorMessage(String err)
	{
		JOptionPane.showMessageDialog(null, err, "Error", JOptionPane.ERROR_MESSAGE);
	}
	
	public void loadImages()
	{
		try
		{
		Bomb.bombImage = ImageIO.read(new File("images/bomb.png"));
		Player.bunkerImage1 = ImageIO.read(new File("images/bunker1.png"));
		Player.bunkerImage2 = ImageIO.read(new File("images/bunker2.png"));
		}
		catch (Exception e)
		{
			Game.showErrorMessage("Couldn't load game images:" + e.getMessage());
			System.exit(1);
		}
	}
	
	public static void main(String args[])
	{
		Game game = new Game();
	}

}
```


----------



## FGB (17. Mai 2011)

Hi.

Wenn ich das richtig sehe, arbeitest du ohne LayoutManager.

Wenn ...

1. du mit LayoutManager arbeitest:
Sollte das eigentlich gehen. Mach mal die move()-Methode weg

2. du ohne LayoutManager arbeitest:
Positioniere deinen Panel absolut. Ist Board das Panel? Ich denke mal, oder?
Also:

```
board = new Board();
board.setBound(int x-start, int y-start, int breite, int hoehe)
```

Sprich dein Panel wird mit der oberen linken Kante an der Position x-start (X-Koordinate) und y-start (Y-Koordinate) positioniert.

3. du keine Ahnung hast was ein LayoutManager ist/macht:
A Visual Guide to Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

Grüße und viel Erfolg!

Felix


----------



## mapa (17. Mai 2011)

Das mit dem Layoutmanager scheint noch nich ganz zu funktionieren:


```
this.getContentPane().setLayout(new BorderLayout());
		
board = new Board();
add(board, BorderLayout.CENTER);
pack();
```

Das Fenster ändert seine Größe immer noch nicht 

setBounds() auch nicht..


----------



## Spin (17. Mai 2011)

Hallo , Methode die die komponenten an ihre größe anpasst ist pack().

u kannst bevorzugte größen der komponenten mir c.setPrefferedSize() erreichen.


grüße spin


----------



## FGB (17. Mai 2011)

Deine Klasse Game erbt ja von JFrame, sprich es ist ein JFrame.

Ein LayoutManager setzt du für dein JFrame. damit sagst du, wie weitere Elemente in deinem JFrame angeordnet werden sollen.

Also:

Beispiel, anhand eines FlowLayouts

```
FlowLayout fl = new FlowLayout();
this.setLayout(fl);

Board b = new Board();
this.add(b); // Füge deinem JFrame "Game" das Panel "Board" b hinzu
this.pack(); // passt die Größe automatisch an.
```

Wie Spin schon sagte, ist die JFrame-Methode pack() für ein "Auto-Resize" zuständig.

Grüße
Felix


----------



## Marco13 (17. Mai 2011)

Üblicherweise hantiert man bei einem JFrame nur im ContentPane rum. Mit sowas wie


```
public Game()
    {
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        
        board = new Board();
        board.setPreferredSize(new Dimension(400,400));
        getContentPane().add(board);
        pack();
        setVisible(true);
    }
```

Sollte es funktionieren. Die Zeile 
board.setPreferredSize(new Dimension(400,400));
ist nur notwendig, falls das Board nicht von sich aus eine "vernünftige" PreferredSize zurückgibt.


----------



## Ebenius (18. Mai 2011)

Am Rande: Statt … [java=3]        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });[/code]
… reicht auch … [java=3]setDefaultCloseOperation(EXIT_ON_CLOSE);[/code]

Ebenius


----------



## mapa (18. Mai 2011)

Danke es geht jetzt,

hab im Board Konstruktor setPreferredSize() aufrufen und mit pack() die Größe des frames angepasst.


----------

