# Canvas im JPanel - "Freie" Fläche Problem



## Guest (27. Mai 2007)

Hallo,
ich habe ein Canvas welches ich in ein JPanel einfüge. die Größe des Canvas ist so gefählt dass es eigentlich direkt oben sein müsste.

Raus kommt aber sowas:





Woran könnte das liegen?


----------



## kleiner_held (27. Mai 2007)

Also ohne weitergehende Informationen (z.B.: ein wenig Quellcode, welche Komponenten noch im JPanel sind, welcher LayoutManager verwendet wurde, wie die Komponenten eingefügt wurden usw.) lässt sich das Problem wohl nicht eingrenzen.

PS ge*p*fählt schreibt man mit pf


----------



## Guest (27. Mai 2007)

oh, das sollte "gewählt" heißen ^^

hier mal dasselbe Problem mit wenig code:


```
public class asdf {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setSize(500, 500);

		JPanel p = new JPanel();
		p.setSize(500, 500);
		p.setLocation(0, 0);

		CV c = new CV();
		c.setSize(500, 500);
		c.setLocation(0, 0);

		p.add(c);
		f.add(p);

		f.setVisible(true);
	}

}

public class CV extends Canvas {
	public void paint(Graphics g) {
		g.setColor(Color.green);
		g.fillRect(0, 0, this.getHeight(), this.getWidth());
	}
}
```


----------



## JPKI (27. Mai 2007)

Swing und AWT-Komponenten vertragen sich nicht so gut. Benutz statt dem Canvas ein JPanel und überschreib' dessen Methode "paintComponent()".
www.java-forum.org/de/viewtopic.php?t=5113


----------



## Gast (28. Mai 2007)

Aus einem JPanel bekomm ich leite keine BufferStrategy (geht um ein kleines Spiel) und ich müsste vom JPanel alles aufrufen und nicht umgekehrt von der "Engine" mit nem Graphics Objekt arbeiten.


----------



## kleiner_held (28. Mai 2007)

Wenn du Position und Größe deines Canvas per Hand einstellst, musst du die automatische Positionsberechnung des Panels ausschalten, indem du den LayoutManager auf null setzt.


```
p.setLayout(null);
```

in Zeile 12 deines Beispiels einfügen und es sollte so funktionieren, wie du willst.


----------



## Gast (28. Mai 2007)

Hallo,
sehr interesant, funktioniert 
wenn man die größe oder position des Canvas weglässt funktionierts nicht. Nur wenn man p.setLayout(null) macht.

Danke nochmal


----------



## Quaxli (28. Mai 2007)

Ich vermute jetzt mal es geht um ein Spiel? Das wäre eine der üblichen Gründe für das BufferStrategy-Objekt, daß Du aus dem Canvas haben möchtest.  Aber wozu der Umstand JFrame -> JPanel -> Canvas. Warum packst Du das Canvas nicht gleich  ins JFrame  :?:


----------



## JPKI (28. Mai 2007)

Oder warum nicht gleich ein java.awt.Frame, und darein dann das Canvas???


----------



## Quaxli (28. Mai 2007)

Na, das wäre doch zu einfach und durchgängig  :wink:  :wink:  :wink:


----------



## Gast (30. Mai 2007)

Das Canvas direkt ins Frame klingt nachdenkungswürdig  Mal sehen. Danke für den Tipp.

kein java.awt.Frame da in einem andern "Teil" Swing Komponenten verwendet werden sollen (vermutlich - steht noch nicht so ganz die Überlegungen)


----------

