# Ebenen Problem beim zeichnen auf ein Applet



## 0din (7. Mai 2009)

Wie der Titel schon sagt, ich hab das problem das ich auf ein applet zeichnen muss un das ganze entweder wahnsinnig stottert wenn bewegung rein kommt, oder das manche dinge unter anderen gezeichnet werden obwohl das (aus meiner sicht) nicht möglich wäre.

zur erklärung, es is ein applet das eine karte, ovale und ein bewegliches objekt zeichnen soll. 
die ovale werd ich weiter als radar bezeichnen, das bewegliche objekt als heli ;-)

Das problem im detail:
Ich initialisiere mein applet, lasse den constructor alle nötigen kleinigkeiten rein schmeißen... un dann sollte eig. die paint(Graphics g) methode anspringen und
karte
radare
heli
zeichnen... in der reihenfolge.

Nun passierts aber das entweder mal die radare und der heli unter der karte landen, mal nur die radare erscheinen und mal nur die karte da ist... 

dazu mal passend der betreffende code:


```
public void paint(Graphics g)
	{
		this.g = (Graphics2D)g;
		Graphics2D g2 = (Graphics2D)g;
		g.drawImage( imgMap, 0, 0, this ); //imgMap = pfad zur png datei
		deleteHeli(); //löscht den heli, falls vorhanden und zeichnet automatisch einen neuen (an neue position)
		if(firstTime) //firstTime = soll nur einmal gezeichnet werden
		{
			paintRadar(); //zeichnet die radare
			firstTime = false;
		}
	}
```

Das ganze wird nie von mir angerufen sondern ich lasse anrufen...

Was scheinbar das problem ist, es wird jedesmal die map über die radarfelder gezeichnet.

Wie verhindere ich das die paint methode so oft aufgerufen wird bzw. das das ganze feld neu gezeichnet wird?


----------



## Schandro (7. Mai 2009)

Du kannst repaint() als Parameter mitgeben, welcher Bereich nur neugezeichnet werden soll.




> paintRadar();


Warum übergibt du diesen Methoden nicht einfach das Graphics Object, anstatt es in einer Membervaraible zwischenzuspeichern? Grundsätzlich sollte man unnötige Membervariablen vermeiden.

Vorallem weil das Graphics Object eigentlich nur innerhalb der paint Methode bzw. der von ihnen aufgerufenen Methoden benutzt werden sollte.

Wegen dem Flackern:
Falls du noch AWT benutzt, musst du Double Buffering per Hand einbauen.
€dit  => entweder du googelst nach Double Buffering und findest nach ein paar Sekunden ein entsprechendes Codestück zum rauskopieren, oder du steigst z.b. auf Swing um


----------



## 0din (7. Mai 2009)

Das mit den repaint parametern scheint hilfreich.
Frage dazu;
meine erdachte lösung war das überzeichnen der bewegenden teile, sprich:
alte position mit xor einmal überstreichen
neue position ohne xor bestreichen
dabei is nur jedesmal die paint methode angesprungen und hat alles neu gezeichnet.

wenn ich nun direkt beim überstreichen bzw bestreichen die repaint(parameter) anrufe, wird nur der teil gezeichnet oder wird damit wieder automatisch die paint angerufen?

Edit=> das beschränkte repaint lässt schonmal die meisten sachen aufhören zu flackern, nur noch nich den heli bzw das viereck das um den heli repainted wird...


das Graphics als instance variable:
ich hab das problem das ich mit observer un oberservable arbeiten muss und aus der update methode direkt meine deleteHeli() anrufe, diese müsste schon ein graphics haben da se die paintHeli() anruft... da ich aber leider selbst kp hab wie ich sowas anmache (nicht instanzierbar) muss es via paint un daraus fischen... 


Double Buffering:
Nette idee... leider is das ganze kein Frame sondern das Applet selbst... 
awt is bedingung der uni... swing wär mir auch lieber, da is das buch besser ;-)


----------



## 0din (7. Mai 2009)

Thema erledigt...

Kaum is das ganze kein JApplet sondern ein JPanel schon tuts... nen tag arbeit für die tonne... 

Dennoch danke für die hilfe... die repaint mit parametern wird sicher noch helfen ;-)


----------

