# Aufteilung von JPanels in einem Frame



## skappler (30. Aug 2012)

Hallo Leute
Ich arbeite gerade an der GUI für ein Spiel und habe Probleme, wie ich das ganze intern aufteile. 
Die Oberfläche besteht aus einer HUD links und unten und einer Fläche für die Map.
So soll das ganze von der Aufteilung her aussehen: ImageShack® - Online Photo and Video Hosting 
(Die Bilder sind nur Platzhalter und im Moment einfach auf ein Panel gemalt)

Ich hab mir das ganze so gedacht, dass ich die Map als ein JPanel realisiere und das HUD als ein oder zwei weitere. Mein Problem ist jetzt nur wie ich die Panels platziere. Ich hab wenig Erfahrung mit Layouts, daher weiß ich nicht, was sich da anbieten würde. 
Vielleicht wäre es auch sinnvoller das Ganze komplett anders zu gestalten. 

Könnt ihr mir Tipps geben wie ich das ganze so realisiere, dass ich bestmögliche Kontrolle über alles habe und auch alles an seinem Platz bleibt (vor allem für eventuellen Fullscreen Modus)?


----------



## Michael... (30. Aug 2012)

skappler hat gesagt.:


> Die Oberfläche besteht aus einer HUD links und unten und einer Fläche für die Map.
> So soll das ganze von der Aufteilung her aussehen: ImageShack® - Online Photo and Video Hosting
> (Die Bilder sind nur Platzhalter und im Moment einfach auf ein Panel gemalt)


Keine Ahnung wie genau HUD und Map zueinanderangeordnet sind, aber das schaut mir nach einem BorderLayout aus.


----------



## skappler (30. Aug 2012)

Okay vielen Dank. Das sieht soweit schonmal ganz gut aus. Das Problem ist jetzt nur, wie ich die Breite der Panels gestalte. Wenn ich einfach ein neues JPanel mache und sage setSize() und sie danach hinzufüge werden sie nur als schmale Streifen angezeigt. (Ich hab über die Paint methode jedes Panel theoretisch komplett mit Farbe gefüllt)


----------



## bERt0r (30. Aug 2012)

Du gibst bei einer Komponente mit setPreferredSize an wie groß die Komponente sein will, damit sie groß genug ist alles anzuzeigen. Wenn du dann z.B pack() aufrufst, bekommt sie genau diese Größe. Beim Boder Layout werden eventuell Höhe/Breite einer Komponente angepasst um dem Border layout zu entsprechen.


----------



## vanny (30. Aug 2012)

du musst statt setSize(); die setPreferredSize(); benutzen, wenn du mit dem BorderLayout arbeitest.

Die Farbe des Panels kannst du einfach mit setBackground(Color); setzen, dafür braucht es keine paintComponent();


----------



## skappler (30. Aug 2012)

Wer überlegt sich denn sowas -.-
Aber danke für den Tipp mit dem setBackground 

PS: Habs grad ausprobiert und es funktioniert nicht =(


----------



## vanny (30. Aug 2012)

skappler hat gesagt.:


> Wer überlegt sich denn sowas...
> ...Habs grad ausprobiert und es funktioniert nicht =(



1. Wer überlegt sich was?
2. Was funktioniert nicht, die PrefferedSize oder der Background?

KSKB:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.*;

public class PanelAnordnung{
	
	public static void main(String[] args) {
		JFrame fr = new JFrame();
			fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel pnlSouth = new JPanel();
			pnlSouth.setBackground(Color.DARK_GRAY);
			pnlSouth.setPreferredSize(new Dimension(0, 200));// beim BorderLayout wird hier nur die Höhe berücksichtigt
		JPanel pnlWest = new JPanel();
			pnlWest.setBackground(Color.DARK_GRAY);
			pnlWest.setPreferredSize(new Dimension(200, 0));//Hier wird nur die Breite wirksam
		JPanel pnlCenter = new JPanel();
			pnlCenter.setBackground(Color.WHITE);
			pnlCenter.setPreferredSize(new Dimension(400, 300));
		
			fr.getContentPane().add(BorderLayout.SOUTH, pnlSouth);
			fr.getContentPane().add(BorderLayout.WEST, pnlWest);
			fr.getContentPane().add(BorderLayout.CENTER, pnlCenter);
			
		fr.pack();
		fr.setLocationRelativeTo(null);
		fr.setVisible(true);
	}

}
```


----------



## bERt0r (30. Aug 2012)

Wenn er die paint Methode überschrieben hat hilft setBackground natürlich nix mehr. :toll:


----------



## vanny (30. Aug 2012)

bERt0r hat gesagt.:


> Wenn er die paint Methode überschrieben hat hilft setBackground natürlich nix mehr. :toll:



Stimmt, da hab ich Ihn wahrscheinlich in die Irre geführt

[EDIT]Wobei JPanel im Zusammenhang mit paint()-überschreiben tut ja eh immer weh :autsch:[/EDIT]


----------



## skappler (31. Aug 2012)

Ich meinte wer sich überlegt 4 verschiedene setSize methoden einzuführen 

Und das setBackground hat nicht funktioniert, weil ich die paint Methode nicht komplett entfernt, sondern nur das fillRect raus geholt hab.
Wenn du sagst, dass paint überschreiben bei Panels eh immer weh tut, wie soll ich es dann machen? Per Double Buffering?


----------



## vanny (31. Aug 2012)

Kleiner aber feiner Unterschied ^^
Ich sagte nicht, dass das Überschreiben von paint(); beim Panel weh tut, sondern beim JPanel.
Panel ist AWT und JPanel SWING und bei Swingkomponenten wird nicht die paint() sondern die paintComponent() überschrieben.

Das mit dem setBackGround(); bringts natürlich nur wenn du einfach nur den Hintergrund eines normalen JPanels ändern willst, mein Fehler sry.

Naja ich hoffe mal dir wurde hier trozdem geholfen und nicht nur Verwirrung gestiftet

Gruß Vanny


----------



## skappler (31. Aug 2012)

Ich glaub ich bin an der Verwirrung schuld. Ich rede die ganze Zeit von JPanels 
Soll ich dann einfach die paintComponent() überschreiben oder gibt es da andere / bessere Ideen?


----------



## Ebenius (31. Aug 2012)

[c]paintComponent[/c] überschreiben genau richtig, wenn Du das Zeichnen einer Swing-Komponente selbst verändern willst.

Ebenius


----------



## Michael... (31. Aug 2012)

Und wenn man in der paintComponent 
	
	
	
	





```
super.paintComponent(g)
```
 aufruft, wird der Hintergrund auch in der per setBackground(Color) gesetzten Farbe dargestellt.


----------

