Java小應用程序(Applet)的設計課件_第1頁
Java小應用程序(Applet)的設計課件_第2頁
Java小應用程序(Applet)的設計課件_第3頁
Java小應用程序(Applet)的設計課件_第4頁
Java小應用程序(Applet)的設計課件_第5頁
已閱讀5頁,還剩85頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

Java小應用程序(Applet)的設計12.1編寫一個Applet12.2Applet的通信12.1編寫一個Applet

要編寫一個Applet,必須首先從java.applet.Applet派生一個類:

importjava.applet.*;publicclassSimpleAppletextendsApplet{…}

需要注意的是,派生出的Applet的類必須定義為public類型。java.applet.Applet類實際上是java.awt.Panel的子類。Applet和AWT類的繼承關(guān)系如圖12.1所示。圖12.1

這種層次關(guān)系顯示,一個Applet可直接用作一個AWT布局的容器。因為Applet是Panel的子類,所以它有一個缺省的流(Flow)布局管理器。Component,Container和Panel類的方法被Applet類繼承了下來。

12.1.1Applet的執(zhí)行框架在Java出現(xiàn)之前,人們就已經(jīng)開始使用HTML(超文本標記語言)進行Web頁面的設計了。然而,對HTML稍有了解的人都知道,HTML所提供的設計能力是極其有限的。Java率先提供了讓Web頁面實現(xiàn)更豐富的GUI和邏輯運算能力的方法,這種方法是通過將一個Java的類插入到Web頁面中來實現(xiàn)的。

如何編寫一個Applet并令它在瀏覽器中執(zhí)行呢?方法很簡單,只要繼承java.applet包下的Applet類,并實現(xiàn)一些必要的方法即可。下面我們來看一個最簡單的Applet的例子,并學會怎樣在瀏覽器中令它運行。例12.1SimpleApplet.javaimportjava.applet.*;importjava.awt.*;publicclassSimpleAppletextendsApplet{Stringtext=null; publicvoidinit() { text="Asimpleappletdemo!"; setBackground(Color.YELLOW); } publicvoidstart() { System.out.println("starting..."); } publicvoidstop(){

System.out.println("stopping..."); } publicvoiddestroy() { System.out.println("preparingtounload..."); } publicvoidpaint(Graphicsg) { System.out.println("Paint");g.drawString(text,15,25); }}

上面是一個最簡單的Applet例子,大家可能已經(jīng)發(fā)現(xiàn),這個程序沒有main()方法,的確,我們前面所學到的Java應用程序都必須由main()方法處進入,而在一個Applet中卻不是這樣。Applet的生命周期稍微有些復雜,它需要通過瀏覽器來運行,所以為了執(zhí)行它,還必須有一個HTML編寫的Web頁面。例12.2SimpleApplet.html<html><body><appletname="SimpleApplet"codebase=.code=SimpleApplet.classwidth=200height=100></applet></body></html>

這里將不準備詳細討論有關(guān)HTML的問題,如果不太了解,可以自己查閱相關(guān)資料。我們只稍微解釋一下上面的HTML代碼。它通過標記<Applet>和參數(shù)告訴瀏覽器下載執(zhí)行一個Applet。其中,name這個參數(shù)表示Applet的名字;codebase表示編譯好的Applet字節(jié)碼的路徑;code表示Applet文件的文件名;width和height指定了該Applet的寬度和高度。name和codebase這兩個參數(shù)并不是必須的,如果Applet字節(jié)碼文件和html文件在同一路徑下,則可以不加codebase參數(shù)。width和height這兩個參數(shù)一定要加,所以在Applet程序中可以不需要設置Applet的Panel的大小。

把這個HTML文件和編譯好的Applet保存在同一個目錄下(HTML文件并不一定要和Applet同名),然后用瀏覽器打開這個HTML文件,將看到這個最簡單的小應用程序的運行結(jié)果。除了通過瀏覽器來運行Applet,Java平臺本身也提供了一個調(diào)試Applet的方法。在JDK包中帶有一個小應用程序觀察器AppletViewer.exe,只要在Windows命令行窗口中輸入:

appletviewerSimpleApplet.html

就會看到和在瀏覽器中運行基本相同的輸出結(jié)果。圖12.2和圖12.3分別列出了通過兩種方式運行例子SimpleApplet的輸出結(jié)果。

現(xiàn)在我們來看看這個Applet到底是如何運作的。大家可能已經(jīng)注意到,在上面的例子SimpleApplet中,沒有main()方法。一般的Java應用程序都是由main()方法處進入,而在Applet中卻不是這樣。在構(gòu)造函數(shù)完成了它的任務后,瀏覽器將自動調(diào)用init()方法,所以通常把Applet的基本初始化操作放在這里。init()結(jié)束后,瀏覽器調(diào)用另一個稱為start()的方法,start()通常在Applet成為可見時被調(diào)用。start()方法結(jié)束后,piant()方法會緊接著被調(diào)用來向Applet的Panel上繪圖。這樣,一個Applet就已經(jīng)運行起來了。用戶離開了Applet所在的頁面時,stop()方法被調(diào)用停止Applet的一些工作。直到瀏覽器關(guān)閉時,destroy()方法才被調(diào)用來完成最后的清除工作。當然Applet的生命周期比上面所討論的要稍微復雜一些。圖12.2

圖12.312.1.2Applet的安全機制我們已經(jīng)知道,Applet是通過瀏覽器下載并自動運行的,這聽起來好像有些可怕,通過瀏覽器自動運行,這不正是病毒制造者的"夢想"嗎。Applet的設計者可能會把Applet設計成一個病毒,并借助瀏覽器讓它進入用戶的計算機。聽起來很可怕,但Java的設計者們也考慮到了這一點,所以對Applet的能力做了種種限制,只要一個Applet試圖違反安全條例,小應用程序安全管理器(AppletSecurityManager)就會發(fā)出一個SecurityException(安全違例)消息。

那么到底哪些是Applet可以做的,哪些是不可以做的呢?小應用程序所能夠控制的安全程度是在瀏覽器層次上實現(xiàn)的,小應用程序的安全機制通過"沙箱"(sandbox)控制。在大多數(shù)瀏覽器上,在沙箱內(nèi)運行時,缺省地禁止以下操作:●運行時執(zhí)行另一程序:小應用程序絕不能運行任何一個本地可執(zhí)行程序?!袢魏挝募妮斎?輸出:小應用程序不能讀/寫本地計算機的文件系統(tǒng)?!裾{(diào)用任何本地方法:除了所用Java版本號,操作系統(tǒng)名和版本號,小應用程序不能獲取任何與本地計算機有關(guān)的信息,也不能通過調(diào)用任何本地方法、API等方法獲得。特別是,小應用程序不能獲得用戶名、電子郵件地址等等信息?!駠L試打開除提供Applet的主機之外的任何系統(tǒng)的Socket:除了下載它的服務器之外,小應用程序不能和任何一臺主機通信。

這些限制的關(guān)鍵在于:通過限制Applet對系統(tǒng)文件的存取來阻止它侵犯一個遠程系統(tǒng)的隱私或破壞該系統(tǒng);禁止執(zhí)行另一程序和不允許調(diào)用本地方法限制了Applet啟動未經(jīng)JVM檢查的代碼;對Socket的限制則禁止了與另一個可能有危害性的程序的通信。由于小應用程序是由JVM(JavaVirtualMachine)解釋執(zhí)行的字節(jié)碼,而非由CPU直接執(zhí)行的機器碼,所以只要在JVM中檢查了小應用程序的指令和程序區(qū)域,就可以確定,小應用程序不會對用戶計算機系統(tǒng)造成較大的危害。表12.1顯示了小應用程序在沙箱中運行時的功能。表12.1小應用程序的功能

瀏覽器中運行小應用程序觀察器中運行讀/寫本地文件否是獲取文件信息否是刪除文件否是運行另一程序否否讀取username屬性否是連接服務器上的網(wǎng)絡端口是是連接另一臺主機上的網(wǎng)絡端口否是下載Java庫否是調(diào)用退出否是創(chuàng)建一個彈出試窗口帶有警告信息是

在這些限制下,小應用程序的能力似乎大打折扣了,這對那些惡意的設計者是有效的措施,但是也給開發(fā)者們造成了限制。如果沒有辦法打破這些限制,那么小應用程序所能做的就太有限了。對此,Java的設計者也提供了解決辦法,那就是簽名類。小程序提供者可以編寫一個帶有簽名的Applet,當瀏覽器下載并運行這個Applet的時候,會提示用戶這是一個簽名Applet類,并詢問用戶是否信任該設計者。如果取得用戶的信任,那么這個Applet就可以突破所有的限制,像一個普通應用程序那樣在用戶的計算機上運行了。12.1.3Applet的主要方法

Applet類的一些主要方法有:●publicvoidinit()

該方法在Applet被瀏覽器載入內(nèi)存后自動調(diào)用,通常用來初始化數(shù)據(jù)的值。本方法只在Applet首次裝入時被調(diào)用,并在調(diào)用start()方法前完成。假如要創(chuàng)建一個Applet生存期內(nèi)的線程,就可以在該方法中創(chuàng)建,在destory方法中結(jié)束?!駊ublicvoidstart()

當init()方法完成后,瀏覽器會自動調(diào)用start()方法。它的執(zhí)行使得Applet成為"活動"的。并且每次Applet成為可見的時,它都要執(zhí)行一次,如:當瀏覽器在被最小化后又恢復時,或者從其他web頁返回含有這個Applet的頁面時。通常我們把主要程序代碼寫在這里,這一方法的典型用法是啟動動畫和播放聲音。●publicvoidstop()

當瀏覽器切換到另一個web頁面或?qū)⒁P(guān)閉時,會自動調(diào)用stop()方法。通常在該方法中加入一些暫停動作,例如暫停音樂或動畫的播放,以便用戶從其他Web頁面切換回包含該Applet的頁面時,可以通過調(diào)用start()方法繼續(xù)播放下去?!駊ublicvoiddestroy()

用戶關(guān)閉瀏覽器時,必須終止Applet的運行,并回收資源。此時,destroy()方法會自動被調(diào)用。該方法是Applet在生存期中執(zhí)行的最后一個方法,所以通常在這里釋放一些在init()中分配的資源,如創(chuàng)建的線程等。瀏覽器在調(diào)用destory()方法時,會先調(diào)用一次stop()方法?!駊ublicAudioClipgetAudioClip(URLurl)

返回由參數(shù)url所指定的AudioClip對象。AudioClip是一個音頻剪輯對象的接口,它提供了音頻對象的抽象控制。無論url指定的音樂文件是否存在,getAudioClip()方法都會很快返回值,因為音頻文件要等到播放的時候才下載。url參數(shù)指定的必須是一個絕對地址?!駊ublicURLgetCodeBase()

返回Applet所在網(wǎng)址?!駊ublicURLgetDocumentBase()

返回包含該Applet對象的Web頁面的地址。●publicImagegetImage(URLurl)

返回參數(shù)url所指定的圖片文件的Image對象。和getAudioClip()方法類似,不管指定地址的文件是否存在,getImage()方法都會立即返回值。圖片文件在Applet顯示在屏幕上時才會下載。url參數(shù)指定的必須是一個絕對地址?!駊ublicStringgetParameter(Stringname)

返回由HTML文件所提供的參數(shù)信息。Applet提供了從Web頁面文件中提取參數(shù)的方法,可以在HTML文件中通過<param>標記設置一些參數(shù)供Applet使用,例如有如下的HTML代碼:<appletcode="Clock"width=50height=50> <paramname=Colorvalue="blue"></applet>

調(diào)用"getParameter("Color")"將返回"blue"。注意參數(shù)名是不區(qū)分大小寫的?!駊ublicBooleanisActive()

檢查Applet是否處于活動狀態(tài)。當瀏覽器調(diào)用start()方法時,Applet即進入活動狀態(tài),而一旦stop()方法被調(diào)用,即進入非活動狀態(tài)。●publicvoidplay(URLurl)

播放由參數(shù)url指定的音頻剪輯,如果該音頻剪輯不存在,則不做任何事情。url參數(shù)指定的必須是一個絕對地址●publicvoidshowStatus(Stringmsg)

在瀏覽器的狀態(tài)欄上顯示由參數(shù)msg指定的文字信息,以便通知用戶Applet的當前狀態(tài)。通過第一節(jié)的例子,我們已經(jīng)明白了Applet運行的方式和它的生命周期。下面我們通過實例來學習如何運用以上方法寫出有趣的Applet。例12.3ShowImageApplet.javaimportjava.applet.*;importjava.awt.*;import.*;publicclassShowImageAppletextendsApplet{ StringImageName=null; StringAudioName=null; Imageimg=null; AudioClipaudio=null;publicvoidinit() { ImageName=getParameter("image"); img=getImage(getDocumentBase(),ImageName); AudioName=getParameter("audio"); audio=getAudioClip(getDocumentBase(),AudioName); } publicvoidstart() { audio.play(); }publicvoidpaint(Graphicsg) { g.drawImage(img,0,0,this); } }ShowImageApplet.html<html><body><appletname="ImageShower"code=ShowImageApplet.classwidth=200height=100>

<paramname="image"value="getJava.gif"> <paramname="audio"value="windowsstart.wav"></applet></body></html>圖12.4

這個例子展示了如何通過getImage()方法載入一個圖片對象,并將它顯示在瀏覽器中以及在啟動Applet的時候播放一段音樂。首先,通過getParameter()方法從HTML代碼中提取出參數(shù),即Image和Audio文件的文件名。然后通過getImage()方法和getAudioClip()方法取得Image和Audio文件的對象。它們包括兩個參數(shù),getDocument()返回包含Applet的Web頁所在的地址,第二個參數(shù)getJava.gif指定圖片文件名。最后在start()方法中播放音樂。這樣,Applet每次啟動時都會伴隨著一段音樂。在paint()方法中調(diào)用drawImage()方法顯示圖片,運行時圖片getJava.gif和windowsstart.wav兩個文件必須和ShowImageApplet.html文件在同一目錄下,其運行結(jié)果如圖12.4所示。

運行結(jié)果如圖12.4所示。值的注意的是,如果通過圖片來源地址/getjava/images/getJava_head.gif來構(gòu)造一個URL對象,并通過getImage()方法載入它的話可能會引發(fā)一個訪問違例。這是由于Applet的安全機制。前面已經(jīng)提到,Applet禁止:包含該Applet的Web頁面所在主機以外的其他任何機器通信。所以無法從其他的URL下載一個資源。12.1.4Applet標記以下為Applet標記的完整句法:<applet>[archive=archiveList]code=appletFile.classwidth=pixelsheight=pixels[codebase=codebaseURL][alt=alternateText][name=appletInstanceName][align=alignment][vspace=pixels][hspace=pixels]>[<paramname=appletAttribute1value=value>][<paramname=appletAttribute2value=value>]...[alternateHTML]</applet>

這些標記的意義如下:●archive=archiveList

這一可選屬性描述了一個或多個含有將被"預裝"的類和其他資源的archives。類的裝載由帶有給定codebase的AppletClassLoader的一個實例來完成。ArchiveList中的archives以逗號(,)分隔。●code=appletFile.class

這是一個必需的屬性,它給定了含有已編譯好的Applet子類的文件名。也可用package.appletFile.class的格式來表示。注:這個文件與你要裝入的HTML文件的基URL有關(guān),它不能含有路徑名。要改變Applet的基URL,可使用<codebase>。●width=pixelsheight=pixels

這些必需的屬性給出了Applet顯示區(qū)域的初始寬度和高度(以像素為單位),不包括Applet所產(chǎn)生的任何窗口或?qū)υ捒??!馽odebase=codebaseURL

這一可選屬性指定了Applet的基URL――包含有Applet代碼的目錄。如果這一屬性未指定,則采用文檔的URL。

●alt=alternateText

這一可選屬性指定了當瀏覽器能讀取Applet標記,但不能執(zhí)行JavaApplet時要顯示的文本?!駈ame=appletInstanceName

這個可選屬性為Applet實例指定有關(guān)名稱,從而使得在同一頁面上的Applet可找到彼此(以及互相通信)。●align=alignment

這個可選屬性指定了Applet的對齊方式。它的可取值與基本的HTML中IMG標記的相應屬性相同,為left,right,top,texttop,middle,absmiddle,baseline,bottom和absbottom等?!駐space=pixelshspace=pixels

這些可選屬性指定了在Applet上下(vspace)及左右(hspace)的像素數(shù)目。其用法與IMG標記的vspace和hspace屬性相同。●<paramname=appletAttribute1value=value>

這個標記提供了一種可帶有由"外部"指定的數(shù)值的Applet,它對一個Java應用程序的作用與命令行參數(shù)相同。Applet用getParameter()方法來存取它們的屬性,該方法將在稍后作更詳細的討論。不支持Java程序執(zhí)行的瀏覽器將顯示被包括在<applet>和</applet>標記之間的任何常規(guī)的HTML;而可支持Java技術(shù)的瀏覽器則忽略介于這兩個標記之間的HTML代碼。12.1.5從Applet中彈出窗口有時候我們可能覺得瀏覽器的界面不利于布局管理,一個浮在頂端的窗口或?qū)υ捒蚋芤俗⒛?。實際上,確實可以從Applet程序中彈出一個如同應用程序一般的窗口來。這有時也有利于我們將現(xiàn)成的應用程序轉(zhuǎn)成小應用程序,如果我們只是僅僅想它通過瀏覽器下載運行,而不需要做太多功能上的調(diào)整,從Applet程序中彈出一個窗口也許是個好的解決辦法,也就是給它披上一個Applet的外殼。下面這個例子是一個小型的計算器的程序,它通過Applet的一個按鍵彈出一個Frame,而計算器功能的實現(xiàn)都在Frame中。Applet的功能僅僅是從瀏覽器啟動它,僅僅是它的一層外殼。例12.4CalculatorApplet.javaimportjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassCalculatorAppletextendsApplet implementsActionListener{ //彈出的窗口

privateFramecalcFrame=newCalculatorFrame(); publicvoidinit(){ //彈出的按鍵

ButtoncalcButton=newButton("Calculator"); calcButton.addActionListener(this); add(calcButton); } publicvoidactionPerformed(ActionEventevt) { //彈出窗口如果沒有被顯示,則顯示它,否則關(guān)閉它

if(calcFrame.isVisible()) calcFrame.setVisible(false);else calcFrame.setVisible(true); }} classCalculatorFrameextendsFrame implementsActionListener{ privateTextFielddisplay=null; privatedoublearg1=0; privateStringBufferarg2=newStringBuffer(); privatecharop='=';publicCalculatorFrame() { setTitle("Calculator"); setSize(200,200); setLayout(newBorderLayout()); //輸出窗口

display=newTextField("0"); display.setEditable(false); add(display,"North"); //數(shù)字按鍵盤

Panelkeypad=newPanel();Panelkeypad=newPanel(); keypad.setLayout(newGridLayout(4,4)); //添加數(shù)字和運算符按鍵

Stringkeys="789/456*123-0.=+"; for(inti=0;i<keys.length();i++) { Buttonbtn=newButton(keys.substring(i,i+1)); keypad.add(btn);//為按鍵添加事件監(jiān)聽器

btn.addActionListener(this); } add(keypad,"Center");}

publicvoidactionPerformed(ActionEventevt) { //響應按鍵,如果是數(shù)字則連接到StringBuffer中,

//如果是運算符則進行運算。

Stringkey=evt.getActionCommand(); charc=key.charAt(0); if((c>='0'&&c<='9')||c=='.'|| (c=='-'&&arg2.length()==0)) { arg2.append(c); display.setText(arg2.toString());}

else { calculate(Double.parseDouble(arg2.toString())); op=c; arg2.setLength(0); if(c=='=') arg2.append(arg1); } } publicvoidcalculate(doublearg2) {//計算

switch(op) { case'+':arg1+=arg2;break; case'-':arg1-=arg2;break; case'*':arg1*=arg2;break; case'/':arg1/=arg2;break; case'=':arg1=arg2;break; default:break;

}

display.setText(""+arg1); }}

這個窗口是一個功能簡陋的計算器面板。由于只需給它配上最簡單的HTML代碼,所以這里不再列出。圖12.5是該程序的運行結(jié)果。

圖12.5

彈出窗口Applet

我們注意到,在彈出窗口的最底下有一行字"JavaAppletWindow",這是對這個窗口的一個說明,也是所有瀏覽器都具備的一個安全特性。它提示用戶這是一個由運行于瀏覽器的Applet彈出的窗口,而不是從機器上運行的一個程序。試想如你運行了一個惡意的Applet程序,它可能會彈出一個窗口,這個窗口與你本地某個需要輸入賬號、密碼的應用程序有著相同的界面,也許你會被它蒙蔽而錯誤性的輸入了信息,這個Applet就會把這些信息送回主機。

為了避免這種惡作劇出現(xiàn),所有的彈出窗口都在底端顯示一個標簽,警告用戶這是一個小應用程序,而不是本地應用程序。當然,如果你制作一個簽名的小應用程序并得到了用戶的信任,則可以不顯示這個警告標簽。值的一題的是,正如前面所說,這個小應用程序只是通過Applet來啟動了一個彈出窗口,如果在CalculatorApplet類中為它加入一個mian()方法的話,它就可以同時作為Applet和應用程序來運行,大家可以自己試試。12.1.6基于Swing與AWT的Applet的區(qū)別我們已經(jīng)知道,Applet類是從AWT包中的Panel類派生的,而Java2提供的新一代GUI設計包Swing也提供了支持Applet設計的類:javax.swing.Japplet。注意,JApplet類并不是從JPanel類派生的,而是直接從java.applet.Applet類派生出來的。用AWT設計小應用程序時,我們從java.applet.Applet類派生一個子類,現(xiàn)在為了使用Swing包,就必須從avax.swing.JApplet類派生子類。讓我們先來看一個基于JApplet類的小應用程序的實例,然后再分析二者的區(qū)別。例12.5JAppletTest.javaimportjava.awt.*;importjavax.swing.*;publicclassJAppletTestextendsJApplet{ privateJMenuBarmenuBar=newJMenuBar(); publicvoidinit() {ContainercontentPane=getContentPane(); Imageimg=getImage(getDocumentBase(), "getJava.GIF"); Iconicon=newImageIcon( getImage(getDocumentBase(),"getJava.GIF")); JLabellabel=newJLabel("Swing!",icon,SwingConstants.CENTER);

contentPane.add(label,BorderLayout.CENTER); JMenufileMenu=newJMenu("File"); String[]fileItems={"New","Open","Save","Exit"}; for(inti=0;i<fileItems.length;i++) fileMenu.add(fileItems[i]); JMenuhelpMenu=newJMenu("Help"); String[]helpItems={"Helpofhelp","About"}; for(inti=0;i<helpItems.length;i++) helpMenu.add(helpItems[i]);

menuBar.add(fileMenu); menuBar.add(helpMenu); setJMenuBar(menuBar); }}

該程序的運行結(jié)果如圖12.6所示。在該程序中,為小應用程序加入了一個菜單條,這也是基于Swing的小應用程序的一種新特性。圖12.6

從上面的例子來看,基于Swing的小應用程序和基于AWT的小應用程序在架構(gòu)上沒有什么分別,它們的生存方式也是相同的,所以上述例子中也沒有給出start(),stop(),destory()這些方法,而是使用了默認的方法,但是,有幾點需要注意:

(1)JApplet類默認使用BorderLayout作為其容器的布局管理器,其默認約束條件是BordenLayout.CENTER,而Applet的缺省的布局管理器是FlowLayout,且FlowLayout的缺省約束條件是FlowLayout.LEFT,這是二者最顯著的區(qū)別之一。(2)JApplet是只包含一個組件的容器,這個組件就是JRootPane的一個實例,而JRootPane包含了一個稱作內(nèi)容窗格的容器。

(3)"內(nèi)容窗格"包含與特定的小應用程序有關(guān)的所有內(nèi)容,可通過getContentPane()方法獲得。即是說,小應用程序必須把所有的組件添加到內(nèi)容窗格中,而Applet則是把它們直接添加到小應用程序中。

(4)我們不能直接為小應用程序設置布局管理器,而只能對它的內(nèi)容窗格設置布局管理。

(5)JApplet的實例可以有一個菜單欄,它是由setJMenuBar()方法指定的,而AWT小應用程序卻不能。

基于Swing的小應用程序比基于AWT的小應用程序有更多的優(yōu)勢,它可以使用Swing提供的更多界面元素和性能。但是它也有一個很大的缺陷,那就是很多瀏覽器都不能支持Swing編寫的小應用程序,而必須依靠安裝JavaPlug-in包。雖然可以讓瀏覽器在運行Swing小應用程序時自動下載這個包,但是由于JavaPlug-in包并不小,所以對于非寬帶上網(wǎng)的用戶來說是不可忍受的。12.2Applet的通信12.2.1Applet與瀏覽器的通信我們已經(jīng)學習過如何通過getParameter()方法從瀏覽器的Web頁中獲取信息,同時,Applet也可以要求瀏覽器為自己做事,例如我們可以讓瀏覽器打開一個指定的Web頁。為了與瀏覽器通信,需調(diào)用Applet的getAppletContext()方法。這個方法返回一個實現(xiàn)了AppletContext接口的對象,這個接口是實現(xiàn)Applet和瀏覽器通信的一座橋梁。

除了getAudioClip()和getImage()外,AppletContext接口還提供了四個有用的方法,它們是get-Applet()、getStream()、showDocument()和showStatus(),我們將在本節(jié)和下面的小節(jié)中講述它們的用法。在小應用程序中可以訪問瀏覽器的兩個區(qū):狀態(tài)行和頁面顯示區(qū),但都必須通過調(diào)用AppletContext接口中的方法來實現(xiàn)。通過調(diào)用showStatus(Stringstatus)方法,可以在瀏覽器底部的狀態(tài)行中顯示一行字符串提示信息,例如:

showStatus("LoadingData…pleasewait");

但是,遺憾的是,使用showStatus()顯示提示信息的功能很有限,因為瀏覽器自己也在使用狀態(tài)行,而且經(jīng)常使用。它總是用新的提示信息改寫前一次的信息,用戶往往無法注意到某一條信息,所以不能用該方法來顯示一些重要信息。在瀏覽器頁面顯示區(qū)顯示信息的方法是showDocument(),它可以通知瀏覽器打開一個指定的URL資源。showDocument()方法的定義如下:

showDocument(URLurl);

showDocument(URLurl,Stringtarget);

第一種格式的調(diào)用可以讓瀏覽器直接打開一個新的URL資源,并將它顯示在當前瀏覽器顯示區(qū)中,替換原來顯示的Web頁面。第二種格式的調(diào)用多了一個String類型的參數(shù),第一個參數(shù)依然是指定要顯示的URL資源,第二個參數(shù)則用于指明瀏覽器打開頁面的方式。如果指定值為"_blank",瀏覽器就會另外打開一個新窗口,在新的瀏覽器窗口中顯示指定的Web頁。如果使用HTML3.2以上版本提供的幀特性,則可以將一個瀏覽器的窗口分成多個幀,并給每個幀指定一個名字。用戶可以把自己的Applet放入一個幀中,并利用它來控制其他幀的頁面顯示。表12.2展示了可以用作ShowDocument()方法的第二個參數(shù)的所有字符串及其功能。表12.2showDocument參數(shù)showDocument()的兩個參數(shù)位置“_self”或無顯示在當前幀內(nèi)“_parent”顯示在父容器幀內(nèi)“_top”顯示在頂層幀內(nèi)“_blank”顯示在一個新打開的瀏覽器窗口中其他字符顯示在該字符串指定名的幀內(nèi),如果沒有該幀,就打開一個新窗口顯示,并把這個名稱指定給他例12.6Bookmark.javaimportjava.applet.*;importjava.awt.*;importjava.awt.event.*;import.*;publicclassBookmarkextendsApplet implementsItemListener{

}

publicvoiditemStateChanged(ItemEventevt) { Listsource=(List)evt.getSource(); Stringlink=source.getSelectedItem(); try { AppletContextcontext=getAppletContext(); URLurl=newURL(link); context.showDocument(url,"right");}

catch(Exceptione) { showStatus("Error"+e); } }}Bookmark.html<html><head><title>BookmarkApplet</title><head><framesetcols="300,*"> <framename="left"src="left.html"> <framename="right"></frameset><html>//Left.html<html><title>ABookmarApplet</title><body><Appletcode="Bookmark.class"width=250height=200><paramname=link1value="/"><paramname=link2value="http://www.szptt.net.cn/"><paramname=link3value="/"><paramname=link4value="/"><paramname=link5value=".cn/"></applet></body><html>

這個小應用程序利用了HTML3.2以上版本的窗口分幀的特性,將瀏覽器的頁面顯示區(qū)垂直地分成了兩個幀。左邊的幀包含了上面的Bookmark小應用程序,它在一個列表框中列出了一列網(wǎng)址。點擊其中任何一個網(wǎng)址,就會在右邊的幀中顯示出相應的Web頁來。這個功能類似收藏夾的小應用程序在瀏覽器中運行,結(jié)果如圖12.7所示。圖12.712.2.2同頁Applet之間的通信我們已經(jīng)學習了如何在一個Web頁面中嵌入Applet,實際上,完全可以在同一個Web頁上嵌入一個以上的小應用程序,甚至還可以讓這些Applet互相通信,互相控制。要實現(xiàn)Web頁中的不同Applet之間的通信,這些Applet的codebase必須是相同的,即它們的class文件放在服務器上的同一路徑下。Applet之前的通信是一個高級技巧。我們還記得在嵌入小應用程序的<applet>標記中有一個name參數(shù),我們可以通過這個參數(shù)為嵌入的小應用程序賦予一個名字。然后調(diào)用AppletContext接口的getApplet()方法,獲得對這個小應用程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論