# Probleme mit paint(Graphics g)



## UdjENE (16. Jul 2007)

hi, also wenn ich was in meinem Applet zeichne dann wird es einwandfrei dargestellt. jedoch wenn ich ein anderes Fenster über die Zeichnung im Applet bewege, dann wird die Zeichnung gelöscht.


```
Container cp = getContentPane();
	
	public void paint(Graphics g) {
		super.paint(g);
		g.drawOval(20, 20, 100, 100);
	}
	
	public void init(){
		setSize(200, 200);
		cp.setLayout(null); 
		cp.setVisible(true);
		cp.setLayout(null);
		repaint();
	}
```

liegt es am Code oder ist es generell bei Applets so???


----------



## SlaterB (16. Jul 2007)

vielleicht nur paintComponent() überschreiben?
ist das bei einem JFrame auch so? (wäre leichter zu testen)


----------



## The_S (16. Jul 2007)

Ich hab da ne Vermutung. Poste doch mal ein KSKB ...


----------



## UdjENE (16. Jul 2007)

mit paintComponent() wird leider gar nix gezeichnet.
vielleicht liegts daran, dass ich von der JApplet Klasse erbe?? heir der komplette  Code:


```
public class MyPaint extends JApplet {
	
	Container cp = getContentPane();
	
	public void paint(Graphics g) {
		super.paint(g);
		g.drawOval(20, 20, 100, 100);
	}
	
	public void init(){
		setSize(200, 200);
		cp.setLayout(null); 
		cp.setVisible(true);
		cp.setLayout(null);
		repaint();
	}
}
```


----------



## Beni (16. Jul 2007)

Das ContentPane oder das RootPane direkt über dem Applet wird sagen "hier muss garnicht gezeichnet werden, *ich* zeichne ja schon alles"...
Der Component-Baum muss bei solchen Aktionen berücksichtigt werden.

Schreib dir dock ein JPanel, das ein Oval zeichnet und setze dieses JPanel auf das ContentPane.


----------



## SlaterB (16. Jul 2007)

verstehe ich nicht, warum sagt es das? warum sonst nicht?


----------



## UdjENE (16. Jul 2007)

@Beni: hat geklappt. kann ich nun auch irgendwie z.B Buttons einfügen? weil wenn ich cp.Layout(null) setze, wird zwar der Button angezeigt aber nix gezeichnet.


----------



## Beni (16. Jul 2007)

SlaterB hat gesagt.:
			
		

> verstehe ich nicht, warum sagt es das? warum sonst nicht?


Das ist eine Optimierung von Swing: wenn zwei Components übereinander liegen, kann Swing verhindern, dass die hintere Component gezeichnet wird, weil sie ja von der vorderen verdeckt wird.

Hier wurde mit dem "repaint" in "init" aber explizit gesagt, dass die hintere Component gezeichnet werden muss. Der neue Code von "paint" ruft zuerst die Original-paint auf. Damit wird die hintere Component (das JApplet selbst) gezeichnet. Dann wird die vordere Component (das JRootPane, bzw. das ContentPane) gezeichnet, immernoch von der Original-paint aus. Erst dann, wird das Oval gezeichnet - über allem anderen was schon gezeichnet wurde.

Die Reihenfolge der Zeichenoperationen ist falsch implementiert.

@UdjENE
Sagt mir ohne Code nichts, aber es gibt Lösungen.
Falls du es noch nicht getan hast: überschreibe "paintComponent( Graphics g )" anstelle von "paint( Graphics g )" in diesem JPanel.


----------



## SlaterB (16. Jul 2007)

ah, ok,
du meinst, dass das ContentPane verhindert, dass das JApplet mit dem Oval gezeichnet wird,
da das ConentPane den ganzen Raum ausfüllt (und davor liegt),
sag das doch


----------



## UdjENE (16. Jul 2007)

ok klappt jetzt. ich muss den Button im Konstruktor vom JPanel einfügen.


```
public DrawPanel(){
		setLayout(null);
		BConnect.setBounds(10, 300, 155, 20);
        BConnect.setText("connect");
        add(BConnect,this);
	}
```

danke für die tipps.


----------

