/** After checking out the difference in behavior between 
 ** AnimatorApplet2.java and AnimatorApplet3.java, use JWS 
 ** to change the version of MyApplet10.java that you have
 ** created to a new file called MyApplet11.java, which 
 ** includes double buffering as in AnimatorApplet3.java.
 **
 ** NOTE:  Other than the instructions you are reading,
 ** I have NOT provided you with any code or files--you
 ** are completely on your own. Good luck !               **/
 
 
 /** USE EXISTING JAVA CLASSES **/

import java.awt.*;
import java.applet.Applet;

/** EXTEND THE JAVA APPLET CLASS AND IMPLEMENT THE RUNNABLE INTERFACE **/

public class MyApplet11 extends Applet implements Runnable
   {int frameNumber = -1;                // Define and/or initialize some
    int delay;                           // AnimatorApplet1 class variables.
    Thread animatorThread;
    boolean frozen = true;
    Font font=new Font("TimesRoman",Font.BOLD,25);
    //FontMetrics fontm = getFontMetrics(font);
    String framestr = "";
    //int rval, gval, bval;                // Define red, green, blue color variables.
    Dimension preImageDim;               // Define preImage variables needed to
    Image preImage;                      // create the offscreen copy of the image
    Graphics preImageGraphics;  
    //Color currentColor;         // we want to paint on the screen.

    /** INITIALIZE THE APPLET **/

    public void init()
       {String str;
        int fps = 5;                      // Define the default fps (frames per second).
        str = getParameter("fps");         // Possibly, get HTML string specifying the
        try                                // fps.
         {if (str != null)
           {fps = Integer.parseInt(str);}  // If possible, convert HTML fps to an
          }                                // integer.
        catch (Exception e) {}             // In case the try caused something strange.
        delay = (fps > 1) ? (1000/fps): 100; // Convert fps to the milisecond delay
        }                                    // time between frames.

    /** CLICK TO START OR STOP THE APPLET **/

    public boolean mouseDown(Event e, int x, int y)
       {if (frozen)
         {frozen = false;
          start();}
        else
         {frozen = true;
          stop();}
        return true;
        }

    /** GENERATE AND/OR START THE ANIMATION THREAD **/

    public void start()
       {if (frozen) { }                    // The animation is supposed to stay frozen.
        else                               // Otherwise, generate and/or start the
         {if (animatorThread == null)      // animation thread. Apparently, if run
           {animatorThread = new Thread(this);}  // breaks after catching an exception,
          animatorThread.start();                // the animatorThread though not null
          }                                      // will still need to be restarted.
        }

    /** CREATE AND DISPLAY FRAMES OF THE ANIMATION THREAD **/

    public void run()
       {setBackground(Color.white);
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY); // Set the priority low.
        long startTime = System.currentTimeMillis();             // Remember start time.
        while (Thread.currentThread() == animatorThread)         // The animation loop.
           {frameNumber++;                               // Advance the frame number.
            framestr = "A pharmacist earns $" + frameNumber;           // Create the frame string.
            repaint();                                   // Display the frame.
            try                                          // Sleep for the delay period.
             {startTime += delay;
              Thread.sleep(Math.max(0,
                                    startTime-System.currentTimeMillis()));
              }
            catch (InterruptedException e) {break;}     // In case the try caused
            }                                           // something strange, exit
        }                                               // the while loop.


    /** CREATE THE CURRENT FRAME OF THE ANIMATION THREAD **/
/*
    public void paint(Graphics g)
       {g.setFont(font);
        g.setColor(Color.gray);
        g.drawString(framestr,120,50);
        }
*/

     /** CREATE THE CURRENT FRAME OF THE ANIMATION THREAD **/
    
    public void paint(Graphics g)         // This technique of painting by calling
     {if (!frozen) update(g);}            // update, prevents the default (and hidden)  
					  // behavior of update, and instead allows
    public void update(Graphics g)        // the creation of an offscreen preImage 
     {Dimension d = size();               // preImage before painting the screen.           
      if ((preImageGraphics == null) ||              
	  (d.width != preImageDim.width) ||         // Compare the current applet
	  (d.height != preImageDim.height))         // viewing size to our preImage,
	   {preImageDim = d;                        // and if different, resize our 
	    preImage = createImage(d.width,d.height); // next preImage.
	    preImageGraphics = preImage.getGraphics();
	    }                                
       preImageGraphics.setColor(getBackground());      // Clear the previous preImage
       preImageGraphics.fillRect(0,0,d.width,d.height); // by filling with the current
       preImageGraphics.setFont(font);                  // background color (white),
    
       preImageGraphics.setColor(Color.red); 
	/*String s = "a pharmacist earns $";
	 int xstart = (size().width - fontm.stringWidth(s)) / 2;
	    int ystart = size().height / 2; 
	    */
	//int rval,gval,bval;
	     preImageGraphics.drawString(framestr,20,110);
	   /*rval =(int) Math.floor(Math.random() * 256);      // Generate a random color
	   gval =(int) Math.floor(Math.random() * 256);      // red, green, blue mix.
	   bval =(int) Math.floor(Math.random() * 256);  
	   
	   preImageGraphics.setColor(new Color(rval,gval,bval));
	   int a = (int)Math.floor(Math.random() * 200);
	   int b = (int)Math.floor(Math.random() * 200);
	   //if (frameNumber % 5 == 0)
	   */
	   
	   //preImageGraphics.drawString(framestr,a+20,b+40); 
	   //{currentColor = new Color(rval,gval,bval);}		       
	   //preImageGraphics.setColor(currentColor);// Draw a small box with
						            // the current random color.  
							    // and then create the nex
    // FontMetrics fm = getFontMetrics(f);
	    
	   /* String s = "a pharmacist earns $";
	    int xstart = (size().width - fontm.stringWidth(s)) / 2;
	    int ystart = size().height / 2; 
	    
	     preImageGraphics.drawString(s, xstart, ystart);
    */
    //preImageGraphics.drawString(framestr,80,200);	// offscreen preImage.   
                                  
       g.drawImage(preImage,0,0,this);	  
                   // Paint preImage on the screen.
       } 

/** STOP THE ANIMATION THREAD **/
public void stop()
      {animatorThread = null;     // The user either clicked to stop or left the page,
       //preImageGraphics = null;   // so wipe out the current thread and preImage context.
       //preImage = null;
       }	
    }
