Chinaunix首页 | 论坛 | 博客
  • 博客访问: 807949
  • 博文数量: 780
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-12 09:11
文章分类

全部博文(780)

文章存档

2011年(1)

2008年(779)

我的朋友
最近访客

分类:

2008-09-12 09:13:33


   Applet常用来显示在GIF文件中的图像。 Applet装载GIF图像非常简单,在Applet内使用图像文件时需定义Image对象。多数Java Applet使用的是GIF或JPEG格式的图像文件。Applet使用getImage方法把图像文件和Image对象联系起来。
  Graphics类的drawImage方法用来显示Image对象。为了提高图像的显示效果,许多Applet都采用双缓冲技术:首先把图像装入内存,然后再显示在屏幕上。
  
  Applet可通过imageUpdate方法测定一幅图像已经装了多少在内存中。
  
  装载一幅图像
  Java把图像也当做Image对象处理,所以装载图像时需首先定义Image对象,格式如下所示:
  
  Image picture;
  
  然后用getImage方法把Image对象和图像文件联系起来:
  
  picture=getImage(getCodeBase(),"ImageFileName.GIF");
  
  getImage方法有两个参数。第一个参数是对getCodeBase方法的调用,该方法返回Applet的URL地址,如。第二个参数指定从URL装入的图像文件名。如果图文件位于Applet之下的某个子目录,文件名中则应包括相应的目录路径。
  
  用getImage方法把图像装入后,Applet便可用Graphics类的drawImage方法显示图像,形式如下所示:
  
  g.drawImage(Picture,x,y,this);
  
  该drayImage方法的参数指明了待显示的图像、图像左上角的x坐标和y坐标以及this。
  
  第四个参数的目的是指定一个实现ImageObServer接口的对象,即定义了imageUpdate方法的对象(该方法随后讨论)。
  
  显示图像(ShowImage.java)
  //源程序清单
  import java.awt.*;
  import java.applet.*;
  public class ShowImage extends Applet
  Image picure; //定义类型为Image的成员变量
  public void init()
  {
  picture=getImage(getCodeBase(),"Image.gif"); //装载图像
  }
  public void paint(Graphics g)
  {
  g.drawImage(picture,0,0,this); //显示图像
  }
  }
  
  为此,HTML文件中有关Applet的语句如下:
  
  
  Show Image Applet
    CODE="ShowImage.class" //class文件名为ShowImage.class
  WIDTH=600
  HEIGHT=400>
  
  
  
  编译之后运行该Applet时,图像不是一气呵成的。这是因为程序不是drawImage方法返回之前把图像完整地装入并显示的。与此相反,drawImage方法创建了一个线程,该线程与Applet的原有执行线程并发执行,它一边装入一边显示,从而产生了这种不连续现象。为了提高显示效果。许多Applet都采用图像双缓冲技术,即先把图像完整地装入内存然后再显示在屏幕上,这样可使图像的显示一气呵成。
  
  双缓冲图像
  为了提高图像的显示效果应采用双缓冲技术。首先把图像装入内存,然后再显示在Applet窗口中。
  
  使用双缓冲图像技术例子(BackgroundImage.java)
  
  //源程序清单
  import java.awt.*;
  import java. applet.*;
  public class BackgroundImage extends Applet //继承Applet
  {
  Image picture;
  Boolean ImageLoaded=false;
  public void init()
  {
  picture=getImage(getCodeBase(),"Image.gif"); //装载图像
  Image offScreenImage=createImage(size().width,size().height);
  //用方法createImage创建Image对象
  Graphics offScreenGC=offScreenImage.getGraphics(); //获取Graphics对象
  offScreenGC.drawImage(picture,0,0,this); //显示非屏幕图像
  }
  public void paint(Graphics g)
  {
  if(ImageLoaded)
  {
  g.drawImage(picture,0,0,null); //显示图像,第四参数为null,不是this
  showStatus("Done");
  }
  else
  showStatus("Loading image");
  }
  public boolean imageUpdate(Image img,int infoflags,int x,int y,int w,int h)
  {
  if(infoflags= =ALLBITS)
  {
  imageLoaded=true;
  repaint();
  return false;
  }
  else
  reture true;
  }
  }
  
  分析该Applet的init方法可知,该方法首先定义了一个名为offScreenImage的Image对象并赋予其createImage方法的返回值,然后创建了一个名为offScreenGC的Graphics对象并赋予其图形环境——非屏幕图像将由它来产生。因为这里画的是非屏幕图像,所以Applet窗口不会有图像显示。
  
  每当Applet调用drawImage方法时,drawImage将创建一个调用imageUpdate方法的线程。Applet可以在imageUpdate方法里测定图像已有装入内存多少。drawImage创建的线程不断调用imageUpdate方法,直到该方法返回false为止。
  
  imageUpdate方法的第二个参数infoflags使Applet能够知道图像装入内存的情况。该参数等于ImageLoaded设置为true并调用repaint方法重画Applet窗口。该方法最终返回false,防止drawImage的执行线程再次调用imageUpdate方法。
  
  该Applet在paint方法里的操作是由ImageLoaded变量控制的。当该变量变为true时,paint方法便调用drawImage方法显示出图像。paint方法调用drawImage方法时把null作为第四参数,这样可防止drawImage调用imageUpdate方法。因为这时图像已装入内存,所以图像在Applet窗口的显示可一气呵成。
  
【责编:admin】

--------------------next---------------------

阅读(428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~