Bei leicht komplexeren Annimationen kommt es durch das Löschen des Bildschirms und dem Neuzeichnen zu einem unerwünschten flackern, da natürlich beides gezeichnet wird.
Letztendlich bestimmt die Methode update(), was die paint() Methode macht.
Beispiel: eine langer Strich zieht sich von links - oben nach rechts unten:
Achtung: ohne der Stringausgabe wäre die Ausgbe ruckelnd!
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Image;
// update löscht Bildschirm nicht, wenn überschrieben
public class MyApplet34 extends Applet implements Runnable{
int px = 0;
py = 0;
Thread wiederhole;
Integer integer = new Integer(0);
public void init(){
wiederhole = new Thread(this);
wiederhole.start();
}
public void run(){
while(true){
px+=1;
py+=1;
repaint();
try{ wiederhole.sleep(60);}
catch(InterruptedException e){}
}
}
public void paint(Graphics g){
g.drawOval(px,py,1,1);
g.drawString(integer.toString(px),10,350);
}
public void update(Graphics g){
this.paint(g);
}
}
|
Achtung: Dieses Applet benutzt nur AWT Componenten und sollte daher auf allen gängigen javafähigen Browsern laufen, wenn Java ausgeführt werden darf.
Daher wird in der update() Methode bestimmt, wie die paint Methode vorzugehen hat.
Das Flackern wird vermieden, indem das Bild erst gezeichnet wird, wenn der Bildschirm fertig aufgebaut wurde. Dies ereicht man, indem man ein in einem zweiten unsichtbarem Graphicobject alles erledigt und erst dann die fertige Darstellung auf den Bildschirm projeziert.
Beispiel: Wandender Kreis, der Bildschirmbereich wird mit der Mausbewegung
verschoben, was durch ein Achsenkreuz veranschaulicht wird.

Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Event;
import java.applet.Applet;
//KoordinatenSystem verschieben
//Zusatz: abhängig von der Maus
public class MyApplet32 extends Applet implements Runnable{
private Image dbImage;
private Graphics dbg;
// Kreiskoordinaten
int px = 0;
int py = 0;
// Ursprung des Koordinatensystems
int kx = 0;
int ky = 0;
// Objektname aufgabenbezogen
Thread wiederhole;
//Thread erzeugen und starten
public void start(){
wiederhole = new Thread(this);
wiederhole.start();
}
public void run(){//wiederhole
while(true){
px+=2;//Wert ändern
py+=2;
repaint();//neu zeichnen
try{ wiederhole.sleep(60);}//pausieren
catch(InterruptedException e){}
}
}
// Mauskoordinaten beim Bewegen der Maus abfragen
public boolean mouseMove(Event e, int x, int y){
kx = x;
ky = y;
repaint();//-> siehe paint
return true;
}
// Koordinatenursprung Achsenkreuz und Kreis zeichnen
public void paint(Graphics g){//was zeichnen
// Koordinatenursprung
g.translate(kx,ky);
// Kreis
g.drawOval(px,py,20,20);
// x - Achse
g.drawLine(0,-400,0,400);
// y - Achse
g.drawLine(-400,0,400,0);
// Positionsangebe der Koordinaten
g.drawString("[ Nullpunkt verschoben um: x = "+kx+" / y = "+ky+" ]",10,10);
}
// Doppelbufferung
public void update (Graphics g){
// Ein Imageojekt als Buffer des Bildschirms in der Appletgröße
dbImage = createImage (this.getSize().width, this.getSize().height);
// Imageobjekt des Bildschirms mit dem Graphicsobjekt verknüpfen
dbg = dbImage.getGraphics ();
// Bildschirm im Hintergrund löschen:
// aktuelle Bildschirmfarbe aufnehmen
dbg.setColor (getBackground ());
// Ein Rechteck in der Bildschirmgröße mit
// der ursprünglichen Hintergrundfarbe zeichnen
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// Auf gelöschten Hintergrund Vordergrund zeichnen:
// Farbe des Graphics Objectes aufnehmen
dbg.setColor (getForeground());
// Objekt zeichnen
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem Bildschirm ausgeben
g.drawImage (dbImage, 0, 0, this);
}
}
|
Achtung: Dieses Applet benutzt nur AWT Componenten und sollte daher auf allen gängigen javafähigen Browsern laufen, wenn Java ausgeführt werden darf.