Java/Tutorials/Double Buffering
Aus Scientia
Version vom 8. April 2011, 14:16 Uhr von Alexis Hiemis (Diskussion | Beiträge)
Inhaltsverzeichnis
Was ist Double Buffering?
Double Buffering beschreibt eine Methode um Flackern zu beseitigen, die in der paint() Methode durch direktes Zeichnen von grafischen Objekten(Linien, Kreise, Bilder) verursacht wird. Dabei wird nicht direkt auf das grafische-Element, wie z.B. JPanel, gezeichnet, sondern in einen temporären Bild und anschließend wird das Bild in der paint() Methode gezeichnet. Dies ist aber schlechtes Double Buffering. Um wirklich das Flacker zu beseitigen, muss noch die Methode update() implementiert werden.
Beispiel 1 AWT
public class DBBeispiel extends Panel { int imgWidth=640; int imgHeight=480; //Auf diesen Bild wird dann gezeichnet Image offscreen; //Dies ist die Grafik Device des Bildes(Image offscreen), //worauf man einfach zeichnen kann. Graphics bg; public DBBeispiel() { //erstellt ein Bild von der gr\u00f6\u00dfe imgWidthximgHeight, //in unseren Beispiel also 640x480 offscreen = createImage(imgWidth,imgHeight); //Nun holen wir uns die Grafik Device um auf den Bild Zeichnen zu können bg = offscreen.getGraphics(); } public void paint(Graphics g) { //Als erstes muss der bestehende Inhalt geleert werden bg.clearRect(0,0,dim.width,dim.width); //nun Zeichnen wird auf das Bildes, über die Graphics-Schnittstelle //unbeding darauf achten das es wirklich die Graphics-Schnittstelle des Bildes ist! bg.drawLine(0, 0, 100, 100); // Das Bild wird dann in einen ruck gezeichnet, und wie man erkennt ohne Flackern g.drawImage(offscreen,0,0,this); } //Die Methode update() muss ebenfalls implementiert werden, ansonsten könnte //es weiterhin Flackern public void update(Graphics g) { paint(g); } }
Beispiel 2 Swing
Sun hatte das Problem bereits selbst erkannt und liefert mit Swing gleich, eine solche Methode mit. Alles was man hier nur noch machen braucht ist die Methode setDoubleBuffered() aufzurufen und auf true zu setzen.
public class DBBeispiel extends JPanel { public DBBeispiel() { //wird zwar standardmaessig gesetzt, sicher ist aber sicher setDoubleBuffered(true); } public void paintComponent(Graphics g) { g.drawLine(0, 0, 100, 100); } }