DoubleBuffer.java Source code

Java tutorial

Introduction

Here is the source code for DoubleBuffer.java

Source

/*******************************************************************************
 * All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie
 * 
 * Created on 2004-4-18 16:12:14 by JACK $Id$
 *  
 ******************************************************************************/

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class DoubleBuffer {
    Display display = new Display();
    Shell shell = new Shell(display);

    public DoubleBuffer() {
        shell.setLayout(new FillLayout());

        final Image imageEclipse = new Image(display, "java2s.gif");

        //      final Canvas canvas = new Canvas(shell, SWT.NULL);
        //      canvas.addPaintListener(new PaintListener() {
        //         public void paintControl(PaintEvent e) {
        //            Point size = canvas.getSize();
        //
        //            int x1 = (int) (Math.random() * size.x);
        //            int y1 = (int) (Math.random() * size.y);
        //            int x2 = Math.max(canvas.getBounds().width - x1 - 10, 50);
        //            int y2 = Math.max(canvas.getBounds().height - y1 - 10, 50);
        //
        //            
        //            e.gc.drawRoundRectangle(x1, y1, x2, y2, 5, 5);
        //
        //            display.timerExec(100, new Runnable() {
        //               public void run() {
        //                  canvas.redraw();
        //               }
        //            });
        //            
        //         }
        //      });

        final Canvas doubleBufferedCanvas = new Canvas(shell, SWT.NO_BACKGROUND);

        doubleBufferedCanvas.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                // Creates new image only absolutely necessary.
                Image image = (Image) doubleBufferedCanvas.getData("double-buffer-image");
                if (image == null || image.getBounds().width != doubleBufferedCanvas.getSize().x
                        || image.getBounds().height != doubleBufferedCanvas.getSize().y) {
                    image = new Image(display, doubleBufferedCanvas.getSize().x, doubleBufferedCanvas.getSize().y);
                    doubleBufferedCanvas.setData("double-buffer-image", image);
                }

                // Initializes the graphics context of the image. 
                GC imageGC = new GC(image);
                imageGC.setBackground(e.gc.getBackground());
                imageGC.setForeground(e.gc.getForeground());
                imageGC.setFont(e.gc.getFont());

                // Fills background. 
                Rectangle imageSize = image.getBounds();
                imageGC.fillRectangle(0, 0, imageSize.width + 1, imageSize.height + 1);

                // Performs actual drawing here ...
                Point size = doubleBufferedCanvas.getSize();

                int x1 = (int) (Math.random() * size.x);
                int y1 = (int) (Math.random() * size.y);
                int x2 = Math.max(doubleBufferedCanvas.getBounds().width - x1 - 10, 50);
                int y2 = Math.max(doubleBufferedCanvas.getBounds().height - y1 - 10, 50);

                imageGC.drawRoundRectangle(x1, y1, x2, y2, 5, 5);

                // Draws the buffer image onto the canvas. 
                e.gc.drawImage(image, 0, 0);

                imageGC.dispose();

                display.timerExec(100, new Runnable() {
                    public void run() {
                        doubleBufferedCanvas.redraw();
                    }
                });
            }
        });

        shell.setSize(300, 200);
        shell.open();
        //textUser.forceFocus();

        // Set up the event loop.
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                // If no more entries in event queue
                display.sleep();
            }
        }

        display.dispose();
    }

    /**
     * Equips the specified canvas with double buffering to reduce flicker.
     * 
     * @param canvas
     */
    public static void enableDoubleBuffer(Canvas canvas) {

    }

    public static void main(String[] args) {
        new DoubleBuffer();
    }
}