Below, is a "complete" program. It draws 10 randomly placed lines of randomly selected colors on the image at a time; in a separate thread, it then displays the "updated" image. The drawing is done in thepaint
method, and the display is done in therun
method. Other applications that used this architecture would move an object across the screen in thepaint
method one increment at a time, display one of a list of images for an animation, etc.import java.applet.*; import java.awt.*; import java.util.*; public class DoubleBuf extends Applet implements Runnable { boolean pause = false; Thread runThread = null; Image offScreen; int rd, gr, bl; int x1, y1, x2, y2; Color c; Color backGround = new Color (0xffffff); int imageWidth, imageHeight; Random random; // ************* init public void init () { random = new Random (); } // end init // ************* start public void start () { runThread = new Thread ( this ); runThread.start (); } // end start // ************* stop public void stop () { if ( runThread != null ) runThread.stop (); runThread = null; } // end stop // ************* mouseDown public boolean mouseDown ( Event event, int x, int y) { if ( runThread != null ) pause = true; else { pause = false; start (); } // end else; return true; } // end stop // ************* paint public void paint ( Graphics g, Dimension d ) { for ( int i = 0; i < 10; i++ ) { rd = (int)( 255 * random.nextFloat () ); gr = (int)( 255 * random.nextFloat () ); bl = (int)( 255 * random.nextFloat () ); x1 = (int)( d.width * random.nextFloat () ); y1 = (int)( d.height * random.nextFloat () ); x2 = (int)( d.width * random.nextFloat () ); y2 = (int)( d.height * random.nextFloat () ); g.setColor ( new Color ( rd, gr, bl ) ); g.drawLine ( x1, y1, x2, y2 ); } // end for } // end paint // ************* run thread public void run () { Dimension d; Graphics g; while ( ! pause ) { d = this.size (); if ( ( offScreen == null ) || ( imageWidth != d.width ) || ( imageHeight != d.height ) ) { offScreen = this.createImage ( d.width, d.height ); imageWidth = d.width; imageHeight = d.height; } // end if g = offScreen.getGraphics (); paint ( g, d ); g = this.getGraphics (); g.drawImage ( offScreen, 0, 0, Color.white, this ); try {Thread.sleep ( 10 );} catch ( InterruptedException e) {;} } // end while runThread = null; } // end run } // end DoubleBufRun the applet