import javax.swing.*;
import java.awt.*;
public class Example extends JApplet{
public void paint(Graphics g){
int k;
Graphics2D g2=(Graphics2D)g;
this.setBounds(20,30,200,300);
Font f=new Font("SansSerif",Font.BOLD+Font.ITALIC,15);
g2.setFont(f);
g2.setColor(Color.red);
for(k=0; k<5; k++){
g2.drawString("k="+k,4*(k+1),20*(k+1));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
g2.drawString("The end of Applet Thread!",4*(k+1),20*(k+1));
}
}
[b]问题补充:[/b]
谢谢你的回答!
我运行的怎么是两遍呀 !!
是先输出:
k=0
k=1
k=2
k=3
k=4
然后刷新了,又输出:
k=0
k=1
k=2
k=3
k=4
The end of this dos thread
我试了一下,好像是this.setBounds(20,30,200,300); 导致的第二遍
不知道是为什么??
哈哈,试了一下, 果真是两次!
不知道楼主对AWT/Swing的事件分发机制了解多少.这里人一篇文章, 楼主可以看下:
[url]http://piscesky.iteye.com/blog/143236[/url]
因为AWT/Swing使用的单线程模型的事件分发, 所以AWT/Swing的事件都是一个一个执行的, 我就拿你的例子大致说一下, 你的程序首先调用paint方法, 执行到[code="java"]this.setBounds(20,30,200,300); [/code]这时, 因为更改了位置, 所以会触发一个窗口重绘事件(会调用这个paint方法), 但是这个事件不是马上执行, 而是加到一个事件队列中, 等当前线程执行完了之后, 会从事件队列中拿出触发的重绘事件执行,所以就产生了第二次输出!
说的比较笼统, 楼主可以找找这方面的文章.
另外, 楼主可以做个实验, 多调几次setBounds方法, 你会发现调了几次就执行了paint几次!但是如果你的setBounds和当前的位置一样, 就不会执行, 也就是说:
[code="java"]
this.setBounds(20,30,200,300);
this.setBounds(20,30,200,300);
[/code]
这样只会触发一次
[code="java"]
this.setBounds(20,30,200,300);
this.setBounds(10,30,200,300);
[/code]
这样会触发两次
不明白你说的输出了两次是怎么产生的!我试了下, 只输出了一次!如果你把窗口最大化最小化, 或者把窗口的大小变一下, 它会重绘的, 也就是整个窗口重画一次!