# Animation hinter transparentem Bild auf der GlassPane



## java2000 (19. Mai 2008)

Hallo zusammen,
ich hoffe, mir kann jemand bei diesem Problem helfen. Ich habe in einem JFrame zwei JComponents nebeneinander. Zu beiden JComponets gehört je ein Thread, der eine Animation darin betreibt, alle 200ms wird dabei mittels DoubleBufferung das nächste Bild gezeichnet.
Wenn nun ein bestimmter Event eintrifft, möchte ich, dass im Vordergrund diese JComponents ein Bild angezeigt wird. Das Bild weist transparente Pixel auf und ist über beide diese JComponets ausgebreitet. Hinter dem Bild soll immer noch die Animation weiter betrieben werden.
Ich habe mir gedacht, dass ich das Bild einfach auf die GlassPane des JFrames zeichne, da diese ja vor den JComponents steht, aber das funktioniert leider nicht. Die JComponents verdecken das Bild jedesmal wieder, wenn die Animation vom zugehörigen Thread neugezeichnet wird.
Ich habe auch versucht, die Threads der beiden JComponents jedesmal die GlassPane mit dem Bild zeichnen zu lassen. Man sieht nun immerhin das Bild, aber es flackert immer noch sehr stark.

Weiss vielleicht jemand, wie ich mein Problem noch elegeanter lösen könnte, so dass die Animationen im Hintergrund sauber weiterlaufen können und im Vordergrund dieses Bild schön ruhig steht?

Gruss
Martin


----------



## André Uhres (20. Mai 2008)

java2000 hat gesagt.:
			
		

> so dass die Animationen im Hintergrund sauber weiterlaufen können und im Vordergrund dieses Bild schön ruhig steht?


TimerAnimation.jar (Quellcode im jar)


----------



## Guest (20. Mai 2008)

Hei André,
danke vielmals für deine Mühe, das war die perfekte Antwort 

Ich habe die beiden Klassen TimerAnimation und Picture nun studiert und das meiste verstanden. Nur etwas habe ich noch nie gesehen, bei der Methode paintComponent(Graphigs g) der Klasse Picture verwendest du eine Umformung in Graphics2D und eine drawImage-Methode mit sehr vielen Parameter. Habe ich das richtig verstanden, dass du damit nur genau den Teil des Bildes nocheinmal zeichnest, der sich wirklich verändert hat? Und die paintComponent Methode wird immer dann aufgerufen, wenn eine Instanz der Klasse TimerAnimation die Methode setLocation(nextX, nextY) (Z.58) aufgerufen hat?

Gruss
Martin


----------



## André Uhres (20. Mai 2008)

"*setLocation*" bewirkt einen repaint, und zwar nur von dem Rechteck, das aktualisiert werden muss.
In "paintComponent" kann man dieses Rechteck mittels "getClipBounds" abfragen.
Der drawImage(..)-Aufruf, mit den angegebenen Parametern, zeichnet nur den
Teil des Bildes neu, der sich mit dem Cliprechteck überschneidet.

Das *Graphics *Objekt in paintComponent ist eigentlich ein Graphics2D,
eine Erweiterung von Graphics mit Verbesserungen bezüglich Steuerung der Geometrie, 
Umwandlungen von Koordinaten, Farbenverwaltung und Textdarstellung.
Graphics2D ist die grundlegende Klasse zur Wiedergabe von 2D Formen,
Text und Bildern auf der Java Plattform.


----------



## java2000 (21. Mai 2008)

Wieso helft ihr mir nicht ihr Scheisskinder?
Scheiss Forum!


----------



## der JoJo (21. Mai 2008)

<°))))<>


----------



## André Uhres (21. Mai 2008)

Ihr Drecksäcke, ich liebe euch  :lol:


----------

