//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
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.*;
/**
* This class demonstrates animation. It uses double buffering
*/
public class AnimatorDoubleBuffer {
// The width (and height) of the image
private static final int IMAGE_WIDTH = 100;
// The timer interval in milliseconds
private static final int TIMER_INTERVAL = 10;
// The location of the "ball"
private int x = 0;
private int y = 0;
// The direction the "ball" is moving
private int directionX = 1;
private int directionY = 1;
// We draw everything on this canvas
private Canvas canvas;
/**
* Runs the application
*/
public void run() {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Animator Double Buffer");
createContents(shell);
shell.open();
// Set up the timer for the animation
Runnable runnable = new Runnable() {
public void run() {
animate();
display.timerExec(TIMER_INTERVAL, this);
}
};
// Launch the timer
display.timerExec(TIMER_INTERVAL, runnable);
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
// Kill the timer
display.timerExec(-1, runnable);
display.dispose();
}
/**
* Creates the main window's contents
*
* @param shell the main window
*/
private void createContents(final Shell shell) {
shell.setLayout(new FillLayout());
// Create the canvas for drawing
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);
// Draw the background
gcImage.setBackground(event.gc.getBackground());
gcImage.fillRectangle(image.getBounds());
// Set the color of the ball
gcImage.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_RED));
// Draw the ball
gcImage.fillOval(x, y, IMAGE_WIDTH, IMAGE_WIDTH);
// Draw the offscreen buffer to the screen
event.gc.drawImage(image, 0, 0);
// Clean up
image.dispose();
gcImage.dispose();
}
});
}
/**
* Animates the next frame
*/
public void animate() {
// Determine the ball's location
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();
}
/**
* The application entry point
*
* @param args the command line arguments
*/
public static void main(String[] args) {
new AnimatorDoubleBuffer().run();
}
}
|