AnimationDoubleBuffering.java Source code

Java tutorial

Introduction

Here is the source code for AnimationDoubleBuffering.java

Source

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class AnimationDoubleBuffering {
    private static final int IMAGE_WIDTH = 100;
    private static final int TIMER_INTERVAL = 10;

    private static int x = 0;
    private static int y = 0;

    private static int directionX = 1;
    private static int directionY = 1;

    private static Canvas canvas;

    public static void animate() {
        x += directionX;
        y += directionY;

        // Determine out of bounds
        Rectangle rect = canvas.getClientArea();
        if (x < 0) {
            x = 0;
            directionX = 1;
        } else if (x > rect.width - IMAGE_WIDTH) {
            x = rect.width - IMAGE_WIDTH;
            directionX = -1;
        }
        if (y < 0) {
            y = 0;
            directionY = 1;
        } else if (y > rect.height - IMAGE_WIDTH) {
            y = rect.height - IMAGE_WIDTH;
            directionY = -1;
        }

        // Force a redraw
        canvas.redraw();
    }

    public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setText("Animator");

        shell.setLayout(new FillLayout());
        canvas = new Canvas(shell, SWT.NO_BACKGROUND);
        canvas.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent event) {
                // Create the image to fill the canvas
                Image image = new Image(shell.getDisplay(), canvas.getBounds());
                // Set up the offscreen gc
                GC gcImage = new GC(image);

                gcImage.setBackground(event.gc.getBackground());
                gcImage.fillRectangle(image.getBounds());
                gcImage.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_RED));
                gcImage.fillOval(x, y, IMAGE_WIDTH, IMAGE_WIDTH);

                // Draw the offscreen buffer to the screen
                event.gc.drawImage(image, 0, 0);

                image.dispose();
                gcImage.dispose();
            }
        });

        shell.open();
        Runnable runnable = new Runnable() {
            public void run() {
                animate();
                display.timerExec(TIMER_INTERVAL, this);
            }
        };
        display.timerExec(TIMER_INTERVAL, runnable);

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        // Kill the timer
        display.timerExec(-1, runnable);
        display.dispose();

    }
}