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

为什么这个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 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]
    这样会触发两次

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突