Re: Help needed to make this stop().
bH wrote:
Hi All,
I have spent a lot of time looking at possibilites at making this stop,
nothing seems to make it happen. I have looked at the deprecated list
for stop. Still nothing makes it stop short of recompiling or getting
the
task manger to stop it. Your help is appreciated.
import java.awt.*;
public class FramedBouncingBalls
extends Frame
implements Runnable {
Thread runner;
Image buffer;
Graphics gBuffer;
Ball ball[];
//how many balls?
static final int MAX = 3;
static final int WIDTH = 500;
static final int HEIGHT = 400;
private int offScreenBufferWidth;
private int offScreenBufferHeight;
public FramedBouncingBalls() {
super("Bouncing Balls");
setSize(WIDTH, HEIGHT);
ball = new Ball[MAX];
int w = WIDTH;
int h = HEIGHT;
//our balls have different start coordinates, increment values
//(speed, direction) and colors
ball[0] = new Ball(w, h, 50, 20, 1.5, 2.0, Color.blue);
ball[1] = new Ball(w, h, 60, 100, 2.0, -3.0, Color.red);
ball[2] = new Ball(w, h, 15, 70, -2.0, -2.5, Color.green);
start();
setVisible(true);
}
public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start();
}
}
public void stop() {
if (runner != null) {
// runner.stop(); // the stop method of Thread has been
deprecated as it was unsafe
runner.interrupt();
setVisible(false);
}
}
public void run() {
while (true)
while (!Thread.interrupted()) {
or
while (!runner.isInterrupted()) {
//Thread sleeps for 15 milliseconds here
try {
Thread.sleep(15);
}
catch (InterruptedException ie) {
}
//move our balls around
for (int i = 0; i < MAX; i++) {
ball[i].move();
}
repaint();
}
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
if (getWidth() != offScreenBufferWidth ||
getHeight() != offScreenBufferHeight) {
buffer = null;
gBuffer = null;
offScreenBufferWidth = getWidth();
offScreenBufferHeight = getHeight();
}
if (buffer == null) {
buffer = createImage(offScreenBufferWidth,
offScreenBufferHeight);
gBuffer = buffer.getGraphics();
}
//draw a gray background and a grid of lines
gBuffer.setColor(Color.gray);
gBuffer.fillRect(0, 0, getWidth(), getHeight());
gBuffer.setColor(Color.lightGray);
//paint our balls
for (int i = 0; i < MAX; i++) {
ball[i].paint(gBuffer);
}
g.drawImage(buffer, 0, 0, this);
}
public static void main(String[] args) {
new FramedBouncingBalls();
}
}
class Ball {
//the boundaries of the window and the diameter of our ball
//we tell our balls the window size by constructor, so we can
//change the applet's size easily
int width, height;
static final int diameter = 30;
//coordinates and value of increment
double x, y, xinc, yinc;
Color color;
Graphics g;
//the constructor
public Ball(int w, int h, int x, int y, double xinc, double yinc,
Color c) {
width = w;
height = h;
this.x = x;
this.y = y;
this.xinc = xinc;
this.yinc = yinc;
color = c;
}
public void move() {
x += xinc;
y += yinc;
//when the ball bumps against a boundary, it bounces off
if (x < 0 || x > width - diameter) {
xinc = -xinc;
x += xinc;
}
if (y < 0 || y > height - diameter) {
yinc = -yinc;
y += yinc;
}
}
public void paint(Graphics gr) {
g = gr;
g.setColor(color);
//the coordinates in fillOval have to be int, so we cast
//explicitly from double to int
g.fillOval( (int) x, (int) y, diameter, diameter);
}
}
--
Knute Johnson
email s/nospam/knute/