Java Applet常用於顯示儲存在GIF檔案中的影像。 Java 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位址,如www.sun.com/Applet 。第二個參數指定從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的語句如下:
<HTML>
<TITLE>Show Image Applet</TITLE>
<APPLET
CODE="ShowImage.class" //class檔案名稱為ShowImage.class
WIDTH=600
HEIGHT=400>
</APPLET>
</HTML>
編譯之後運行該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視窗的顯示可一氣呵成。