home *** CD-ROM | disk | FTP | other *** search
/ Web Programming with Visual J++ / Web_Programming_with_Visual_J_SAMS.NET_Version_1.0_1997.iso / source / chap12 / ex12d.java < prev    next >
Text File  |  1996-09-24  |  4KB  |  158 lines

  1. import java.applet.*;
  2. import java.awt.*;
  3. import java.util.*;
  4.  
  5. public class EX12D extends Applet
  6. {
  7.     protected Panel p = new Panel();
  8.     protected Button CircleButton = new Button("Stop Circles");
  9.     protected Button SquareButton = new Button("Stop Squares");
  10.     protected ThreadGroup Circles = new ThreadGroup("Circles");
  11.     protected ThreadGroup Squares = new ThreadGroup("Squares");
  12.  
  13.     public void init()
  14.     {
  15.         setLayout(new BorderLayout());
  16.  
  17.         p.add(CircleButton);
  18.         p.add(SquareButton);
  19.         add("South", p);
  20.     }
  21.  
  22.     public boolean action(Event evt, Object obj) 
  23.     {
  24.         boolean result = false;            // asume no action
  25.  
  26.         if ("Start Circles".equals(obj)) {
  27.             Circles.resume();
  28.             CircleButton.setLabel("Stop Circles");
  29.  
  30.             result = true;
  31.         }
  32.         else if ("Stop Circles".equals(obj)) {
  33.             Circles.suspend();
  34.             CircleButton.setLabel("Start Circles");
  35.  
  36.             result = true;
  37.         }
  38.         else if ("Start Squares".equals(obj)) {
  39.             Squares.resume();
  40.             SquareButton.setLabel("Stop Squares");
  41.  
  42.             result = true;
  43.         }
  44.         else if ("Stop Squares".equals(obj)) {
  45.             Squares.suspend();
  46.             SquareButton.setLabel("Start Squares");
  47.  
  48.             result = true;
  49.         }
  50.  
  51.         return result;
  52.     }
  53.  
  54.     public void start()
  55.     {
  56.         DrawThread.SetGraphics(getGraphics());
  57.  
  58.         // add two circle threads
  59.         for (int count = 1; count <= 2; count++)
  60.             (new DrawCircleThread(Circles, size().width, 
  61.                     size().height - p.size().height, 
  62.                     count)).start();
  63.  
  64.         // add three square threads
  65.         for (int count = 1; count <= 3; count++)
  66.             (new DrawSquareThread(Squares, size().width, 
  67.                     size().height - p.size().height, 
  68.                     count)).start();
  69.     }
  70.     
  71.     public void stop()
  72.     {
  73.         Circles.stop();
  74.         Squares.stop();
  75.     }
  76. }
  77.  
  78. class DrawThread extends Thread
  79. {
  80.     protected static Graphics g;
  81.     protected static Random r = new Random();
  82.     protected int totalWidth, totalHeight;
  83.     protected int count;
  84.  
  85.     public static void SetGraphics(Graphics _g)
  86.     {
  87.         g = _g;
  88.     }
  89.  
  90.     public DrawThread(ThreadGroup group, int totalWidth, 
  91.             int totalHeight, int count)
  92.     {
  93.         super(group, Integer.toString(count));
  94.  
  95.         this.totalWidth = totalWidth;
  96.         this.totalHeight = totalHeight;
  97.         this.count = count;
  98.     }
  99.  
  100.     public void run()
  101.     {
  102.         while (true) {
  103.             try {
  104.                 sleep(GetNextRandom(4, 1) * 1000);
  105.             }
  106.             catch (InterruptedException e) {}
  107.  
  108.             if (g != null)
  109.                 Draw(g, GetNextRandom(totalWidth, 0), 
  110.                         GetNextRandom(totalHeight, 0));
  111.         }
  112.     }
  113.  
  114.     protected synchronized int GetNextRandom(int range, int offset)
  115.     {
  116.         return (int)(r.nextDouble() * (double)range) + offset;
  117.     }
  118.  
  119.     protected void Draw(Graphics g, int x, int y)
  120.     {
  121.     }
  122. }
  123.  
  124. class DrawCircleThread extends DrawThread
  125. {
  126.     protected final static int graphicsSize = 30;
  127.  
  128.     public DrawCircleThread(ThreadGroup group, int totalWidth, 
  129.             int totalHeight, int count)
  130.     {
  131.         super(group, totalWidth - graphicsSize, 
  132.                     totalHeight - graphicsSize, count);
  133.     }
  134.  
  135.     protected synchronized void Draw(Graphics g, int x, int y)
  136.     {
  137.         g.setColor(Color.red);
  138.         g.fillOval(x, y, graphicsSize / count, graphicsSize / count);
  139.     }
  140. }
  141.  
  142. class DrawSquareThread extends DrawThread
  143. {
  144.     protected final static int graphicsSize = 5;
  145.  
  146.     public DrawSquareThread(ThreadGroup group, int totalWidth, 
  147.             int totalHeight, int count)
  148.     {
  149.         super(group, totalWidth - graphicsSize, 
  150.                 totalHeight - graphicsSize, count);
  151.     }
  152.  
  153.     protected synchronized void Draw(Graphics g, int x, int y)
  154.     {
  155.         g.setColor(Color.green);
  156.         g.fillRect(x, y, graphicsSize * count, graphicsSize * count);
  157.     }
  158. }