1 /* 2 * MovingObjects.java 3 * 4 * Double-buffered version of MovingRectangles.java 5 * with boundary checking 6 */ 7 8 import java.applet.*; 9 import java.awt.*; 10 11 public class MovingObjects extends Applet implements Runnable { 12 13 // Instance variables: 14 private int numObj = 3; // number of movable objects 15 private MovableObject object[]; // array of movable objects 16 private Thread thread; // a thread 17 private Image buffer; // image object for double buffering 18 private Graphics gOffScreen; // graphics object for double buffering 19 20 // Override java.applet.Applet.init: 21 public void init () { 22 setBackground( Color.black ); 23 setForeground( Color.white ); 24 25 // Instantiate object array: 26 object = new MovableObject[ numObj ]; 27 // Instantiate a rectangle: 28 object[0] = new MovableRectangle( 10, 10, 100, 100 ); 29 object[0].setDelta( 2, 3 ); 30 object[0].setColor( Color.red ); 31 // Instantiate a circle: 32 object[1] = new MovableOval( 200, 10, 100, 100 ); 33 object[1].setDelta( -3, 2 ); 34 object[1].setColor( Color.blue ); 35 // Instantiate a triangle: 36 object[2] = new MovableTriangle( 10, 200, 100, 100 ); 37 object[2].setDelta( -2, 2 ); 38 object[2].setColor( Color.green ); 39 40 // Create an off-screen image for double buffering: 41 buffer = createImage( getSize().width, getSize().height ); 42 // Get off-screen graphics context: 43 gOffScreen = buffer.getGraphics(); 44 } 45 46 // Override java.applet.Applet.start: 47 public void start() { 48 if ( thread == null ) { 49 thread = new Thread( this ); 50 thread.start(); 51 } 52 } 53 54 // Override java.applet.Applet.stop: 55 public void stop() { 56 if ( thread != null ) { 57 thread.stop(); 58 thread = null; 59 } 60 } 61 62 // Implement java.lang.Runnable.run: 63 public void run() { 64 while ( thread != null ) { 65 repaint(); 66 try { 67 Thread.sleep(20); 68 } catch ( InterruptedException e ) { 69 // Do nothing 70 }; 71 } 72 } 73 74 // Override java.awt.Component.update: 75 public void update( Graphics g ) { 76 // Fill background: 77 gOffScreen.setColor( getBackground() ); 78 gOffScreen.fillRect( 1, 1, getSize().width - 2, getSize().height - 2 ); 79 // Draw boundary: 80 gOffScreen.setColor( getForeground() ); 81 gOffScreen.drawRect( 0, 0, getSize().width - 1, getSize().height - 1 ); 82 83 // Move each object after checking the boundary: 84 for ( int i = 0; i < numObj; i++ ) { 85 object[i].checkBoundary( getBounds() ); 86 object[i].translate(); 87 } 88 paint( gOffScreen ); 89 90 // Draw the buffer in the applet window: 91 g.drawImage( buffer, 0, 0, this ); 92 } 93 94 // Override java.awt.Component.paint (this method is called 95 // once, when the applet loads): 96 public void paint( Graphics g ) { 97 // Paint each object: 98 for ( int i = 0; i < numObj; i++ ) { 99 object[i].paint(g); 100 } 101 } 102 103 }