Paint(Graphics g) Hintergrund flimmert

Hallo zusammen,
mit dem überschreiben der paint funktion lasse ich bilder in einem java.awt.Frame anzeigen, eigentlich nur rectangle keine bilder. Habe mir das bekannte Ping Pong game geschrieben (zwei Balken und ein Ball dazwischen). Funktioniert alles ‚schön‘ und gut, aber der Hintergrund flimmert (nur bei weisser Farbe nicht). Bei mir ruft immer ein Thread die Repaint-Methode auf, habe diesen Thread etwas ausgebremst(Thread.sleep(200)) flimmert aber immernoch.
Habe versucht das Graphics objekt zwischen zu speichern aber funktioniert noch immer nicht. Also ich dachte mir anfangs (als ich das Problem erkannte) ich muss den Hintergrund nicht jedesmal zeichnen, muss ich aber doch weil die Graphics g welche an Paint übergeben wird immer leer (nicht null) ist. Und das zwischenspeichern funktioniert auch nicht, da habe ich aber noch keine Theorie weshalb.
Kann mir jemand helfen?

Das was du beschreibst ist ein Standardproblem bei solchen Anwendungen. Google mal nach ‚double buffering‘. Idee:

Du operierst auf einem Bitmap und wenn du mit der Generierung fertig bist - dann wird dieses im Fenster angezeigt. Dann ist dieser ständige Aufbau, den man als Flimmern wahrnimmt, durch eine schnelle Operation ersetzt worden.

so long,
KoRn

Sun:
http://java.sun.com/docs/books/tutorial/extra/fullsc…

Moien

Funktioniert alles ‚schön‘
und gut, aber der Hintergrund flimmert (nur bei weisser Farbe
nicht).

Beim neu malen wird zuerst die Methode update() aufgerufen. Die löscht den alten Inhalt (indem sie alles weiß übermalt) und ruft dann paint() auf. Das Verhalten kann man etwas steuern und zwischen swing und AWT gibts leichte Unterschiede…

Das Zauberwort heist Doublebuffering. Man malt das aktuelle Spiel nicht in das Graphics-Objekt vom paint-Aufruf sondern in ein Image-Object (BufferedImage oder VolatileImage). Der einzige Aufruf auf dem Graphics-Object vom update Aufruf ist ein drawImage. Dann flackert nix mehr.

cu

Sowas habe ich mir auch überlegt, wollte ein Image abgreiffen was nicht funktionierte. Aber deine Idee ist noch ein Gedankengang weiter. Danke, werde ich mal versuchen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Dann könnte ich nicht auch einfach die Update funktion überschreiben? Löschen(also mit Hintergrundfarbe) mach ich selbst.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ok, für diese kleine Anwendung hat das überschreiben der update(Graphics g) funktioniert. Bei grösseren Projecten müsste ich aber wahrscheinlich auch auf doublebuffering zurückgreifen. Ich musste nur dort das Graphics-objekt an paint weitergeben.
Löschen tue ich manuell, bis jetzt funktioniert das prima. Danke für die antwort.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]