import java.awt.*;
import java.util.concurrent.*; //*4 We maintain list of our Box's
/**
* A process that grabs Box's and draws a row of them
*/
public class Row implements Runnable { //*1 We use a thread
private Canvas canvas;
private Rectangle loc;
private CopyOnWriteArrayList<Box> boxes = new CopyOnWriteArrayList<Box> (); //*4
public Row (Rectangle loc, Canvas canvas) {
this.loc = loc;
this.canvas = canvas;
// Start a new thread to run us
Thread thread = new Thread (this); //*1
thread.start(); //*1
}
/**
* Method for Runnable
*/
public void run () { //*2 What thread does when you run() it
for (int i=0; i<10; i++) { //*2
boxes.add (new Box ()); //*2
// Since we've just changed our box list, request a repaint
canvas.repaint (); //*2
try {
Thread.sleep (2000 + (int) (500 * Math.random ())); // 2-2.5 seconds //*2
} catch (InterruptedException e) { }
}
System.out.println ("Row at y = " + loc.y + " finished"); //*3 Thread is about to die, print message
}
public void draw (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.draw (loc);
// We tell each Box where to draw itself
int boxsize = loc.height-2*5;
Rectangle boxloc = new Rectangle (loc.x+10, loc.y+5,
boxsize, boxsize);
// Draw each of our Box's
for (Box b: boxes) { //*4
b.draw (g, boxloc); //*4
boxloc.x = boxloc.x + boxsize + 10; //*4
}
}
}