java awt 等待_AWT 中图像的异步加载和等待图像的完全加载

图像的异步加载

图像的加载和显示是异步进行的,图像的生产者(ImageProducer)传递给图像的消费者(ImageConsumer)一个与图像相关的位,因为图像的生产过程是一个异步行为,所以 AWT 也提供一个图像观察(ImageObserver),用来监视图像生产者的图像生产过程。

因为 java.awt.Component 实现 ImageObserver 接口,所以 AWT 中每个构件都是ImageObserver ,当一个给定的 ImageProducer 采取异步操作时,这个 ImageObserver 可以选择是否被更新。

现在看一个例子:

4f1150b881333f12a311ae9ef34da474.pngimport java.net.URL;

4f1150b881333f12a311ae9ef34da474.pngimport java.applet.Applet;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.Graphics;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.Image;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngpublicclassImageTestAppletSimple2

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif    extends Applet9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngprivateImage im;

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidinit()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    im=getImage(getCodeBase(),"lena.jpg");

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidpaint(Graphics g)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    System.out.println("drawing image

9b8a8a44dd1c74ae49c20a7cd451974e.png");

d18c02628675d0a2c816449d98bda930.png    System.out.println(g.drawImage(im,0,0,this));

ecedf933ec37d714bd4c2545da43add2.png  }8f1ba5b45633e9678d1db480c16cae3f.png}

当这个 Applet 第一次被调用时,将打印出下面的结果:

drawing image...falsedrawing image...falsedrawing image...falsedrawing image...true执行结果说明 drawImage() 在第一次被调用时,没有图像被加载,drawImage() 只是向和图像相关的 ImageProducer 注册 ImageObserver,图像被完全加载前 drawImage() 方法返回 false 直到图像被完全加载返回 true。

当 drawImage() 返回之后,只要有图像的新的部分被加载,ImageObserver 中的 imageUpdate() 方法就会被调用。当 ImageObserver 是 AWT 构件时,Component.imageUpdate() 调用 repaint() 方法清除构件背景并调用 paint() 方法重绘刚刚得到的图像位。重复循环,ImageProducer 加载图像的下一块,调用 ImageObserver 的 imageUpdate()。当图像被完全加载时,ImageProducer 停止调用 ImageObserver 的 imageUpdate(),循环中断。

load -> imageUpdate() -> repaint() -> update() -> paint()

等待图像的完全加载上面的例子介绍了图像的异步加载,现在介绍2个方法使图像完全加载前不显示。

·重载 ImageObserver 中的 imageUpdate() 方法,使其在图像完全加载前不调用 repaint()。

4f1150b881333f12a311ae9ef34da474.pngimport java.applet.Applet;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.Graphics;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.Image;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngpublicclassImageTestAppletWithUpdate

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif    extends Applet9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngprivateImage im;

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidinit()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    im=getImage(getCodeBase(),"lena.jpg");

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidpaint(Graphics g)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    g.drawImage(im,0,0,this);

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicboolean imageUpdate(Image image,intflags,intx,inty,intw,inth)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    System.out.println("imageUpdate():x="+x+",y="+y+",w="+w+",h="+d18c02628675d0a2c816449d98bda930.png                       h);

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif( (flags&ALLBITS)==0)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturntrue;//need more updatesecedf933ec37d714bd4c2545da43add2.png}97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifelse9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png      repaint();

d18c02628675d0a2c816449d98bda930.pngreturnfalse;//image is fully loadedecedf933ec37d714bd4c2545da43add2.png}ecedf933ec37d714bd4c2545da43add2.png  }8f1ba5b45633e9678d1db480c16cae3f.png}

·使用 java.awt.MediaTracker 类跟踪图像的加载,不必重载 imageUpdate() 方法。

4f1150b881333f12a311ae9ef34da474.pngimport java.net.URL;

4f1150b881333f12a311ae9ef34da474.pngimport java.applet.Applet;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.Graphics;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.Image;

4f1150b881333f12a311ae9ef34da474.pngimport java.awt.MediaTracker;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngpublicclassImageTestAppletWithMediaTracker

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif    extends Applet9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngprivateImage im;

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidinit()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    im=getImage(getCodeBase(),"lena.jpg");

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png    MediaTracker tracker=newMediaTracker(this);

d18c02628675d0a2c816449d98bda930.png    tracker.addImage(im,0);

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png      tracker.waitForID(0);

ecedf933ec37d714bd4c2545da43add2.png    }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifcatch(InterruptedException e)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png      e.printStackTrace();

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png    System.out.print("Image width ="+im.getWidth(this));

d18c02628675d0a2c816449d98bda930.png    System.out.println("height ="+im.getHeight(this));

ecedf933ec37d714bd4c2545da43add2.png  }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidpaint(Graphics g)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    g.drawImage(im,0,0,this);

ecedf933ec37d714bd4c2545da43add2.png  }8f1ba5b45633e9678d1db480c16cae3f.png}

我们可以把使用 java.awt.MediaTracker 类将图像完全加载的方法包装成一个实用方法

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png   * 使用 java.awt.MediaTracker 将图像完全加载。

d18c02628675d0a2c816449d98bda930.png   *@paramcomponent Component

d18c02628675d0a2c816449d98bda930.png   *@paramimg Image

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicstaticvoidwaitForImage(Component component, Image img)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    MediaTracker tracker=newMediaTracker(component);

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png      tracker.addImage(img,0);

d18c02628675d0a2c816449d98bda930.png      tracker.waitForID(0);

ecedf933ec37d714bd4c2545da43add2.png    }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifcatch(InterruptedException ex)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png      ex.printStackTrace();

ecedf933ec37d714bd4c2545da43add2.png    }8f1ba5b45633e9678d1db480c16cae3f.png  }

posted on 2005-07-11 13:47 leon 阅读(444) 评论(0)  编辑  收藏 所属分类: JFC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值