There are times when it makes sense to have multiple animations
running at once. In this case rather than implementing Runnable
, you should subclass
Thread. The
following program demonstrates this with an applet that bounces two
balls independently of each other.
import java.awt.*;
import java.applet.*;
public class TwoBall extends Applet implements Runnable {
private Ball b1;
private Ball b2;
private Thread t;
public void init () {
b1 = new Ball(10, 32, this.getSize());
b1.start();
b2 = new Ball(155, 75, this.getSize());
b2.start();
t = new Thread(this);
t.start();
}
public void paint (Graphics g) {
g.fillOval(b1.getX(), b1.getY(), b1.getWidth(), b1.getHeight());
g.fillOval(b2.getX(), b2.getY(), b2.getWidth(), b2.getHeight());
}
public void run() {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (true) { // infinite loop
this.repaint();
try {
Thread.sleep(10);
}
catch (InterruptedException ex) {
}
}
}
}
class Ball extends Thread {
private Rectangle r;
private int deltaX = 1;
private int deltaY = 1;
private Dimension bounds;
public Ball(int x, int y, Dimension d) {
r = new Rectangle(x, y, 20, 20);
bounds = d;
}
public int getX() {
return r.x;
}
public int getY() {
return r.y;
}
public int getHeight() {
return r.height;
}
public int getWidth() {
return r.width;
}
public void run() {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (true) { // infinite loop
r.x += deltaX;
r.y += deltaY;
if (r.x + r.width >= bounds.width || r.x < 0) {
deltaX *= -1;
}
if (r.y + r.height >= bounds.height || r.y < 0) {
deltaY *= -1;
}
try {
Thread.sleep(30);
}
catch (InterruptedException ex) {
}
}
}
}