1.Java Applet概述
Java程序分為兩類:Java小程序(Applet)和Java應用程序(Applic ation),這兩類程序是有區別的。Java Applet嵌入在WWW的頁面,作為 頁面的組成部分被下載,並能運行在實現Java虛機器(JVM)的Web浏覽 器中。Java的安全機制可以防止小程序存取本地文件或其他安全方面 的問題。而一個Java應用程序運行於Web浏覽器之外,沒有Applet運行 時的諸多限制。另外,兩者程序設計上的最大區別在於:Java Applet 沒有主程序,而Java應用程序一定要有主程序。
在Java中每個applet都是由Applet的子類來實現。開發人員自定 義的applet通過重載A pplet的幾個主要成員函數完成小應用程序的 初始化、繪制和運行。這些函數是init()、pa int()、start()、sto p()和destory()。
一個applet的生命周期與Web頁面有關。當首次加載含applet的 頁面時,浏覽器調用ini t()方法,完成applet的初始化。然後調用pai nt()或start()方法繪制或啟動程序。當用戶離開頁面時,浏覽器調用 stop()方法停止小程序運行。若用戶關閉浏覽器將使applet停止運行 ,浏覽器調用destory()方法終止,使小應用程序有機會釋放其存在期 間鎖定的資源。只要用戶不關閉浏覽器,重新加載頁面,浏覽器則只調 用start()方法和paint()方法重新繪制並運行小程序。
2.擴展小程序基類支持多線程
通常情況下,設計小程序是為了給主頁增加交互性,使頁面更加生 動活潑。因此,那些真正有用小程序,如動畫、實時更新Internet服務 器信息回取、一般娛樂等通常都是持續運行的,即小程序的邏輯主體 存在著無限循環。這個邏輯主體不宜放在幾個浏覽器調用方法中,如i nit()、paint()、start()等。這是因為隱含情況下,小程序所有主邏 輯都采用單一線程。當浏覽器調用方法中出現死循環,則程序控制不 返回。假如用戶換到另一個頁面之後小程序還在運行,就會浪費處理 器資源。你可以做一個實驗,使用小程序查閱器運行小程序,你會發現 查閱器本身完全停止作用,因為它要等到調用函數返回後,才能繼續處 理其他事情(如響應菜單)。顯然,這個邏輯主體必須放在其他地方。 解決方法是在小程序框架中加入線程,把邏輯主體放在線程run()方法 中。只在浏覽器調用方法start()中生成線程,而在stop()中終止線程 運行,這樣當用戶不查閱時不會占用處理器資源。圖2表示浏覽器、小 程序和線程之間的關系。
由於浏覽器/小程序/線程是所有浏覽器都采用的模型,而Java.ap plet.Applet類本身並不支持線程。在實際使用中,為方便操作,我們 可以派生Applet類生成一個支持線程的子類, 今後再編寫applet時, 就可以直接從子類中派生,程序邏輯主體放在run()方法中,將線程控 制隱藏起來。這個子類如下:
import Java.applet.*;
import Java.awt.*;
class MultiThreadApplet extends Applet implements Runnab le {
Thread thisThread;
public void start() {
if (thisThread==null) {
thisThread=new Thread (this);
thisThread.start();
}
}
public void stop() {
if (thisThread!=null) {
thisThread.stop();
thisThread=null;
}
}
public void run() { }
}
由於run()是接口Runnable的抽象方法,所以在MultiThreadApple t類中也需要進行定義,只不過內容為空。下面的例子顯示如何使用這 個類。程序包含一個無限循環累加操作,並將結果顯示在屏幕上:
import java.awt.*;
public class counter extends MultiThreadApplet{
int Counter;
public void run(){
while(true) {
counter++;
repaint();
}
}
public void paint(Graphics g){
g.drawString(string.valueof(counter), 10, 10); }
}
很顯然,這個小程序對線程的操作已被隱藏在MultiThreadApplet 中。
3.解決動畫中的一些問題
動畫的本質就是運動的圖形,一系列連續顯示的靜止圖形會給我 們一種連續動畫的假象。只要動畫速度足夠快,則分散的靜止圖形就 會合並成一個連續運動的流程。
繪制動畫十分簡單,只需遵照以下三步即可:①擦去整個小程序繪 圖區;②重畫動畫背景;③在新的位置繪制圖形。但是,當動畫連續幀 之間運動和顏色不連續時就會發生閃爍現象( 例子略)。問題出在小 程序區的屏幕刷新上,有兩種方法可以防止動畫閃爍。第一種方法是 只做局部刷新,即每次只擦除改變的部分。例如:假如要繪制一幅"飛 行的星空"動畫,每次刷新操作,先擦去前一位置的星星,再在新的位置 繪制一個。但是,假如動畫比較復雜,運動部分重疊較多,則局部刷新 操作很繁瑣也影響程序運行速度。在這種情況下,可以用另外一種方 法( 雙緩存)來解決閃爍問題。它的核心思想是在屏幕外完成一幀的 全部動畫,然後把最後繪制完的幀顯示在小程序屏幕上。過程如圖3所 示。
示例程序如下:
import java.awt.*;
public class Ball extends MultiThreadApplet {
Image ball=null;
Image applet=null;
Graphics appletG,ballG;
public void run() {
if(ball==null) {
applet=createlmage(bounds().width, bounds().
height);
ball=create Image(70,70);
appletG=applet.getGraphics();
ballG=ball.getGraphics();
ballG.setColor(Color.gray);
ballG.drawOral(0,0,70,70); }
for(int x=0;x<400;x++) {
double angle=((double)x)/20;
int y=(int)(Math.abs(Math.sin(angle))*80);
appletG.clearRect(0,0,bounds().width.bounds(),
helght);
drawBackground(appletG);
appletG.drawImage(ball,x.80y,this);
this.getGraphics().drawImage(applet,0,0,this);
try {
Thread.sleep(25);
} catch(Exception ignored) { } }
}
private void drawBackground(Graphics g){
for (int i=0;i<1;i++){
g.drawLine(0.i* 10, 400,i*10); }
}
}
小程序首先用createImage()取得與小程序大小完全相同的屏外 圖形緩存,賦給變量app let,然後得到緩存的繪圖對象appletG。以後 對幀的刷新操作過程都是針對appletG。這包括清除幀、繪制背景、 在新位置繪制圖形。最後再用drawImage()方法把緩存復制到小程序 的屏幕顯示區。運行這個小程序,你會發現動畫非常平滑,不存在閃爍 現象。
除了閃爍之外,假如動畫過於復雜,幀速率就可能降低。若動畫降 到每秒20幀,則動畫會出現間斷現象影響顯示效果。因此有必要優化 動畫速度,下面列出了一些可行的方案;①畫得盡可能少;②用較快的 繪圖算法;③用顏色循環等技巧來繪畫某一部分;④用圖案來表示細節 ;⑤用定點整數進行三維計算;⑥用查詢的預先計算結果來處理復雜算 法。
4.縮短小程序裝入時間
真正功能性的小程序本身並不小,這就意味著小程序從Internet 上下載需要花很多時間。隨著小程序的普及,越來越多的Internet頻 帶被用於從各地的服務器向客戶端Web浏覽器傳送這些小程序,因此響 應時間進一步下降。為了縮短小程序下載和裝入時間,可以采取以下3 種方法。
?使執行文件盡量小盡管Internet (TCP協議)可以接受任意長度 的數據流,但負責點對點傳送的網絡設備(例如:路由器)對一次傳送分 組包的上限有嚴格的限制,通常這一限制是2 56的整數倍。因此,當小 程序在網上傳送時,按照上限它被分成若干包,而最後一個包可能只有 幾個字節。這些包是單獨傳送,需要在客戶端重新組裝為原先小程序 執行文件字節流。當最後一個包延遲時,可能要用好幾秒來等待最後 幾個字節到達。唯一的解決辦法就是保持類文件盡量小。開發人員可 以在不影響程序邏輯主體的前提下嘗試下列方案:①刪除查錯代碼;② 縮小String直接量;③選擇Java編譯器優化編譯選項;④刪除用不到的 方法等。
?類散保持在可控范圍內幾乎沒有一個小程序是由一個類組成。 通常,開發人員為了實現一個功能較強的小程序需要從標准的Java基 類中派生出若干子類,並對之進行組合。因此,若要使一個小程序運行 ,Java虛擬機就要分別下載並裝入這些類。假如實現中類的數目較多, 下載的時間也就相應較長。我們都知道,下載20個獨立的數據塊比下 載一個相當於20個數據塊之和的大數據塊要花費更多的時間,這是由 於下載每個獨立數據塊都要重新進行網絡聯接,而進行每次聯接都要 花費時間的緣故。因此,開發人員在設計小程序時,類的數目要選擇適 中,即可保證結構層次清楚,又要保證程序精簡,不增加冗余。
?縮短小程序初始化時間用戶討厭等待,因此,程序下載後應盡量 縮短初始化時間。假如預處理工作較多,可以用輔助線程先同用戶進 行交互,例如:問候用戶、詢問用戶姓名、顯示進程指示等。總之,讓 用戶"忙起來"。同時,小程序主線程可以繼續在後台做初始化工作。 有句話請記住:"興奮時時間過得快",充分利用這一現象可以改變用戶 對小程序裝入時間的感覺。
使用Java開發WWW客戶端應用程序十分方便,技術也很多,本文只 簡單介紹幾種方法和注重事項供大家參考。