xyag902
xyag902
2008-08-16 17:45
浏览 237
已采纳

为什么这个Applet小程序要输出两次01234呀

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); 导致的第二遍
不知道是为什么??

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • iteye_14762
    iteye_14762 2008-08-16 20:56
    已采纳

    哈哈,试了一下, 果真是两次!
    不知道楼主对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]
    这样会触发两次

    点赞 评论
  • iteye_14762
    iteye_14762 2008-08-16 18:13

    不明白你说的输出了两次是怎么产生的!我试了下, 只输出了一次!如果你把窗口最大化最小化, 或者把窗口的大小变一下, 它会重绘的, 也就是整个窗口重画一次!

    点赞 评论

相关推荐