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