Re: Event Dispatching Thread Problem
On 1/14/2010 3:54 PM, Thanasis wrote:
i describe what i want to achieve.
From within run method I call repaint() which in turn calls paint().
The paint() includes a for loop.
In the 1st iteration I draw a rectangle say at point(x,y). Then the
Thread sleeps 2 seconds.
In the 2nd iteration I draw another rectangle at some other point
(x+i,y+i).Then the Thread sleeps 2 seconds.
And so on.
During this drawing process I want that a user be able to stop the
applet by pressing a button.
Here's one way to do that.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class test extends Canvas implements ActionListener,Runnable {
private final ArrayList<Rect> list = new ArrayList<Rect>();
private volatile boolean drawingFlag;
private final Random rand = new Random(System.currentTimeMillis());
private volatile int count;
private volatile Thread thread;
public test() {
setPreferredSize(new Dimension(400,300));
}
public void actionPerformed(ActionEvent ae) {
String ac = ae.getActionCommand();
if (ac.equals("Draw")) {
if (drawingFlag)
return;
int w = getWidth();
int h = getHeight();
Rect rect = new Rect(
rand.nextInt(w)-w/8,
rand.nextInt(h)-h/8,
rand.nextInt(w/2),
rand.nextInt(h/2),
new Color(rand.nextInt()));
list.add(rect);
drawingFlag = true;
thread = new Thread(this);
thread.start();
} else if (ac.equals("Stop")) {
thread.interrupt();
}
}
public void run() {
try {
for (int i=0; i<=list.size(); ++i) {
count = i;
repaint();
Thread.sleep(500);
}
} catch (InterruptedException ie) {
System.out.println("interrupted");
}
drawingFlag = false;
}
public void paint(Graphics g) {
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
for (int i=0; count>0 && i<count; i++) {
Rect rect = list.get(i);
g.setColor(rect.color);
g.fillOval(rect.x,rect.y,rect.width,rect.height);
}
}
class Rect extends Rectangle {
public Color color;
public Rect(int x, int y, int width, int height, Color color) {
super(x,y,width,height);
this.color = color;
}
}
public static void main(String[] args) {
test t = new test();
final Frame f = new Frame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
f.dispose();
}
});
f.add(t,BorderLayout.CENTER);
Button b = new Button("Draw");
b.addActionListener(t);
f.add(b,BorderLayout.SOUTH);
Button s = new Button("Stop");
s.addActionListener(t);
f.add(s,BorderLayout.EAST);
f.pack();
f.setVisible(true);
}
}
--
Knute Johnson
email s/nospam/knute2010/