Freie Scripten und Tutorials erstellt von Roland Geyer       Startseite | Gästebuch

Doppelpufferung

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);
  }
}

Applet öffnen

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);
  }
}

Applet öffnen

Achtung: Dieses Applet benutzt nur AWT Componenten und sollte daher auf allen gängigen javafähigen Browsern laufen, wenn Java ausgeführt werden darf.





Weitere freie Tutorials: Rhetorik & Kommunikation Typografie & Layout Bildbearbeitung mit Photoshop oder GIMP Vektorgrafik mit Illustrator, FreeHand, Corel Draw oder Inkscape Layout mit Indesign oder Scribus Druckvorstufe GoLive Html JavaScript Flash & ActionScript Director & Lingo Assembler DOS Java objektorientiert Perl Word Excel Access PowerPoint Outlook Betriebssystem