/** Use JWS to modify MyApplet10.java (previously AnimatorApplet1.java) 
 ** by changing it to have some more interesting behavior besides merely 
 ** displaying the current frame number, e.g. add some changing text, 
 ** color, and/or geometrical shapes.  Also, edit MyApplet10.html in  
 ** the project directory, both to run the MyApplet9.class file you 
 ** create, and so that everything looks nice and works properly.     **/
 
/** USE EXISTING JAVA CLASSES **/

import java.awt.*;
import java.applet.Applet;

/** EXTEND THE JAVA APPLET CLASS AND IMPLEMENT THE RUNNABLE INTERFACE **/

public class MyApplet10 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.ITALIC,40);
    String framestr = "";

    /** INITIALIZE THE APPLET **/

    public void init()
       {String str;
        int fps = 30;                      // 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) ? (5000/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 = "Crazy Number " + 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);
        int rval,gval,bval;
        rval = (int)Math.floor(Math.random() * 256);
        gval = (int)Math.floor(Math.random() * 256);
        bval = (int)Math.floor(Math.random() * 256);
        g.setColor(new Color(rval,gval,bval));
        int a = (int)Math.floor(Math.random() * 200);
        int b = (int)Math.floor(Math.random() * 200);
        g.drawString(framestr,a+20,b+40);
        }

/** STOP THE ANIMATION THREAD **/

    public void stop()
       {animatorThread = null;}  // The user either clicked to stop or left the page,
    }                      