Do you drink java?



      像写情书一样coding

 

AWT中图像的异步加载和等待图像的完全加载

图像的异步加载

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

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

现在看一个例子:

import java.net.URL;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

public class ImageTestAppletSimple2
    
extends Applet {
  
private Image im;

  
public void init() {
    im 
= getImage(getCodeBase(), "lena.jpg");
  }

  
public void paint(Graphics g) {
    System.out.println(
"drawing image");
    System.out.println(g.drawImage(im, 
00this));
  }
}

当这个 Applet 第一次被调用时,将打印出下面的结果:
drawing image...
false
drawing image...
false
drawing image...
false
drawing 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()。


import  java.applet.Applet;
import  java.awt.Graphics;
import  java.awt.Image;

public   class  ImageTestAppletWithUpdate
    
extends  Applet {
  
private  Image im;

  
public   void  init() {
    im 
=  getImage(getCodeBase(),  " lena.jpg " );
  }

  
public   void  paint(Graphics g) {
    g.drawImage(im, 
0 0 this );
  }

  
public   boolean  imageUpdate(Image image,  int  flags,  int  x,  int  y,  int  w,  int  h) {
    System.out.println(
" imageUpdate():x= "   +  x  +   " ,y= "   +  y  +   " ,w= "   +  w  +   " ,h= "   +
                       h);

    
if  ( (flags  &  ALLBITS)  ==   0 ) {
      
return   true //  need more updates
    }
    
else  {
      repaint();
      
return   false //  image is fully loaded
    }
  }
}

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


import  java.net.URL;
import  java.applet.Applet;
import  java.awt.Graphics;
import  java.awt.Image;
import  java.awt.MediaTracker;

public   class  ImageTestAppletWithMediaTracker
    
extends  Applet {
  
private  Image im;

  
public   void  init() {
    im 
=  getImage(getCodeBase(),  " lena.jpg " );

    MediaTracker tracker 
=   new  MediaTracker( this );
    tracker.addImage(im, 
0 );
    
try  {
      tracker.waitForID(
0 );
    }
    
catch  (InterruptedException e) {
      e.printStackTrace();
    }

    System.out.print(
" Image width =  "   +  im.getWidth( this ));
    System.out.println(
" height =  "   +  im.getHeight( this ));
  }

  
public   void  paint(Graphics g) {
    g.drawImage(im, 
0 0 this );
  }
}

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

/**   *//**
   * 使用 java.awt.MediaTracker 将图像完全加载。
   * 
@param  component Component
   * 
@param  img Image
   
*/
  
public   static   void  waitForImage(Component component, Image img) {
    MediaTracker tracker 
=   new  MediaTracker(component);
    
try  {
      tracker.addImage(img, 
0 );
      tracker.waitForID(
0 );
    }
    
catch  (InterruptedException ex) {
      ex.printStackTrace();
    }
  }

posted on 2005-07-12 10:33 leon 阅读(1379) 评论(0)  编辑  收藏 所属分类: JFC


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

DSC_0106.jpg
本博客已经搬家到CSDN
http://blog.csdn.net/chenweionline




常用链接

留言簿(5)

随笔分类

随笔档案

About Technology

My Favorite Website

搜索

积分与排名

最新评论

  • 1. re: 胃痉挛
  • 兄弟们你们都做胃镜了吗开的啥药?有什么养胃秘方啊?请赐教啊!
  • --我也进来了
  • 2. re: 胃痉挛
  • @痛啊
    我感觉比生孩子还疼,生孩子还能有意识呢!这种疼还叫不出来连说话的力气都没了
  • --我也进来了
  • 3. re: 胃痉挛
  • 评论内容较长,点击标题查看
  • --我也进来了
  • 4. re: 胃痉挛
  • 我都周期性的发作,算来有4年了 。每年最少一次,一次最少2天。吃了好多药就差没去做胃镜了。 刚刚发作就随便煮了点姜汤喝下就好了些,不知道还会不会发作了。
  • --许家洛
  • 5. re: 胃痉挛
  • 我昨晚也疼的要死。。上次疼的直接120送医院了,一上120我竟然就不疼了,医院里掉了瓶盐水就放回家了。这次正好国外旅游中,几乎疼了一整晚,整个在床上翻滚状态了。今天不疼了,就是整个人难受。。。求助阿
  • --胃疼
  • 6. re: [Swing]在 JFileChooser 中进行文件验证的小技巧
  • 输入*还是会有问题
  • --ngh
  • 7. re: 胃痉挛[未登录]
  • 昨晚一夜的身不如死的感觉,胃痉挛兄不要来了吧 ,求你了
  • --李飞
  • 8. re: 胃痉挛
  • 评论内容较长,点击标题查看
  • --daidai
  • 9. re: 胃痉挛
  • 评论内容较长,点击标题查看
  • --痛啊
  • 10. re: 胃痉挛
  • 妈啊 痛的快死了~!第一次感觉过这样的痛啊~!和女的生孩子有的一比了吧~!哭哭哭~!
  • --痛啊

阅读排行榜