版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java小應(yīng)用程序(Applet)的設(shè)計(jì)12.1編寫(xiě)一個(gè)Applet12.2Applet的通信12.1編寫(xiě)一個(gè)Applet
要編寫(xiě)一個(gè)Applet,必須首先從java.applet.Applet派生一個(gè)類:
importjava.applet.*;publicclassSimpleAppletextendsApplet{…}
需要注意的是,派生出的Applet的類必須定義為public類型。java.applet.Applet類實(shí)際上是java.awt.Panel的子類。Applet和AWT類的繼承關(guān)系如圖12.1所示。圖12.1
這種層次關(guān)系顯示,一個(gè)Applet可直接用作一個(gè)AWT布局的容器。因?yàn)锳pplet是Panel的子類,所以它有一個(gè)缺省的流(Flow)布局管理器。Component,Container和Panel類的方法被Applet類繼承了下來(lái)。
12.1.1Applet的執(zhí)行框架在Java出現(xiàn)之前,人們就已經(jīng)開(kāi)始使用HTML(超文本標(biāo)記語(yǔ)言)進(jìn)行Web頁(yè)面的設(shè)計(jì)了。然而,對(duì)HTML稍有了解的人都知道,HTML所提供的設(shè)計(jì)能力是極其有限的。Java率先提供了讓W(xué)eb頁(yè)面實(shí)現(xiàn)更豐富的GUI和邏輯運(yùn)算能力的方法,這種方法是通過(guò)將一個(gè)Java的類插入到Web頁(yè)面中來(lái)實(shí)現(xiàn)的。
如何編寫(xiě)一個(gè)Applet并令它在瀏覽器中執(zhí)行呢?方法很簡(jiǎn)單,只要繼承java.applet包下的Applet類,并實(shí)現(xiàn)一些必要的方法即可。下面我們來(lái)看一個(gè)最簡(jiǎn)單的Applet的例子,并學(xué)會(huì)怎樣在瀏覽器中令它運(yùn)行。例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); }}
上面是一個(gè)最簡(jiǎn)單的Applet例子,大家可能已經(jīng)發(fā)現(xiàn),這個(gè)程序沒(méi)有main()方法,的確,我們前面所學(xué)到的Java應(yīng)用程序都必須由main()方法處進(jìn)入,而在一個(gè)Applet中卻不是這樣。Applet的生命周期稍微有些復(fù)雜,它需要通過(guò)瀏覽器來(lái)運(yùn)行,所以為了執(zhí)行它,還必須有一個(gè)HTML編寫(xiě)的Web頁(yè)面。例12.2SimpleApplet.html<html><body><appletname="SimpleApplet"codebase=.code=SimpleApplet.classwidth=200height=100></applet></body></html>
這里將不準(zhǔn)備詳細(xì)討論有關(guān)HTML的問(wèn)題,如果不太了解,可以自己查閱相關(guān)資料。我們只稍微解釋一下上面的HTML代碼。它通過(guò)標(biāo)記<Applet>和參數(shù)告訴瀏覽器下載執(zhí)行一個(gè)Applet。其中,name這個(gè)參數(shù)表示Applet的名字;codebase表示編譯好的Applet字節(jié)碼的路徑;code表示Applet文件的文件名;width和height指定了該Applet的寬度和高度。name和codebase這兩個(gè)參數(shù)并不是必須的,如果Applet字節(jié)碼文件和html文件在同一路徑下,則可以不加codebase參數(shù)。width和height這兩個(gè)參數(shù)一定要加,所以在Applet程序中可以不需要設(shè)置Applet的Panel的大小。
把這個(gè)HTML文件和編譯好的Applet保存在同一個(gè)目錄下(HTML文件并不一定要和Applet同名),然后用瀏覽器打開(kāi)這個(gè)HTML文件,將看到這個(gè)最簡(jiǎn)單的小應(yīng)用程序的運(yùn)行結(jié)果。除了通過(guò)瀏覽器來(lái)運(yùn)行Applet,Java平臺(tái)本身也提供了一個(gè)調(diào)試Applet的方法。在JDK包中帶有一個(gè)小應(yīng)用程序觀察器AppletViewer.exe,只要在Windows命令行窗口中輸入:
appletviewerSimpleApplet.html
就會(huì)看到和在瀏覽器中運(yùn)行基本相同的輸出結(jié)果。圖12.2和圖12.3分別列出了通過(guò)兩種方式運(yùn)行例子SimpleApplet的輸出結(jié)果。
現(xiàn)在我們來(lái)看看這個(gè)Applet到底是如何運(yùn)作的。大家可能已經(jīng)注意到,在上面的例子SimpleApplet中,沒(méi)有main()方法。一般的Java應(yīng)用程序都是由main()方法處進(jìn)入,而在Applet中卻不是這樣。在構(gòu)造函數(shù)完成了它的任務(wù)后,瀏覽器將自動(dòng)調(diào)用init()方法,所以通常把Applet的基本初始化操作放在這里。init()結(jié)束后,瀏覽器調(diào)用另一個(gè)稱為start()的方法,start()通常在Applet成為可見(jiàn)時(shí)被調(diào)用。start()方法結(jié)束后,piant()方法會(huì)緊接著被調(diào)用來(lái)向Applet的Panel上繪圖。這樣,一個(gè)Applet就已經(jīng)運(yùn)行起來(lái)了。用戶離開(kāi)了Applet所在的頁(yè)面時(shí),stop()方法被調(diào)用停止Applet的一些工作。直到瀏覽器關(guān)閉時(shí),destroy()方法才被調(diào)用來(lái)完成最后的清除工作。當(dāng)然Applet的生命周期比上面所討論的要稍微復(fù)雜一些。圖12.2
圖12.312.1.2Applet的安全機(jī)制我們已經(jīng)知道,Applet是通過(guò)瀏覽器下載并自動(dòng)運(yùn)行的,這聽(tīng)起來(lái)好像有些可怕,通過(guò)瀏覽器自動(dòng)運(yùn)行,這不正是病毒制造者的"夢(mèng)想"嗎。Applet的設(shè)計(jì)者可能會(huì)把Applet設(shè)計(jì)成一個(gè)病毒,并借助瀏覽器讓它進(jìn)入用戶的計(jì)算機(jī)。聽(tīng)起來(lái)很可怕,但Java的設(shè)計(jì)者們也考慮到了這一點(diǎn),所以對(duì)Applet的能力做了種種限制,只要一個(gè)Applet試圖違反安全條例,小應(yīng)用程序安全管理器(AppletSecurityManager)就會(huì)發(fā)出一個(gè)SecurityException(安全違例)消息。
那么到底哪些是Applet可以做的,哪些是不可以做的呢?小應(yīng)用程序所能夠控制的安全程度是在瀏覽器層次上實(shí)現(xiàn)的,小應(yīng)用程序的安全機(jī)制通過(guò)"沙箱"(sandbox)控制。在大多數(shù)瀏覽器上,在沙箱內(nèi)運(yùn)行時(shí),缺省地禁止以下操作:●運(yùn)行時(shí)執(zhí)行另一程序:小應(yīng)用程序絕不能運(yùn)行任何一個(gè)本地可執(zhí)行程序?!袢魏挝募妮斎?輸出:小應(yīng)用程序不能讀/寫(xiě)本地計(jì)算機(jī)的文件系統(tǒng)?!裾{(diào)用任何本地方法:除了所用Java版本號(hào),操作系統(tǒng)名和版本號(hào),小應(yīng)用程序不能獲取任何與本地計(jì)算機(jī)有關(guān)的信息,也不能通過(guò)調(diào)用任何本地方法、API等方法獲得。特別是,小應(yīng)用程序不能獲得用戶名、電子郵件地址等等信息?!駠L試打開(kāi)除提供Applet的主機(jī)之外的任何系統(tǒng)的Socket:除了下載它的服務(wù)器之外,小應(yīng)用程序不能和任何一臺(tái)主機(jī)通信。
這些限制的關(guān)鍵在于:通過(guò)限制Applet對(duì)系統(tǒng)文件的存取來(lái)阻止它侵犯一個(gè)遠(yuǎn)程系統(tǒng)的隱私或破壞該系統(tǒng);禁止執(zhí)行另一程序和不允許調(diào)用本地方法限制了Applet啟動(dòng)未經(jīng)JVM檢查的代碼;對(duì)Socket的限制則禁止了與另一個(gè)可能有危害性的程序的通信。由于小應(yīng)用程序是由JVM(JavaVirtualMachine)解釋執(zhí)行的字節(jié)碼,而非由CPU直接執(zhí)行的機(jī)器碼,所以只要在JVM中檢查了小應(yīng)用程序的指令和程序區(qū)域,就可以確定,小應(yīng)用程序不會(huì)對(duì)用戶計(jì)算機(jī)系統(tǒng)造成較大的危害。表12.1顯示了小應(yīng)用程序在沙箱中運(yùn)行時(shí)的功能。表12.1小應(yīng)用程序的功能
瀏覽器中運(yùn)行小應(yīng)用程序觀察器中運(yùn)行讀/寫(xiě)本地文件否是獲取文件信息否是刪除文件否是運(yùn)行另一程序否否讀取username屬性否是連接服務(wù)器上的網(wǎng)絡(luò)端口是是連接另一臺(tái)主機(jī)上的網(wǎng)絡(luò)端口否是下載Java庫(kù)否是調(diào)用退出否是創(chuàng)建一個(gè)彈出試窗口帶有警告信息是
在這些限制下,小應(yīng)用程序的能力似乎大打折扣了,這對(duì)那些惡意的設(shè)計(jì)者是有效的措施,但是也給開(kāi)發(fā)者們?cè)斐闪讼拗?。如果沒(méi)有辦法打破這些限制,那么小應(yīng)用程序所能做的就太有限了。對(duì)此,Java的設(shè)計(jì)者也提供了解決辦法,那就是簽名類。小程序提供者可以編寫(xiě)一個(gè)帶有簽名的Applet,當(dāng)瀏覽器下載并運(yùn)行這個(gè)Applet的時(shí)候,會(huì)提示用戶這是一個(gè)簽名Applet類,并詢問(wèn)用戶是否信任該設(shè)計(jì)者。如果取得用戶的信任,那么這個(gè)Applet就可以突破所有的限制,像一個(gè)普通應(yīng)用程序那樣在用戶的計(jì)算機(jī)上運(yùn)行了。12.1.3Applet的主要方法
Applet類的一些主要方法有:●publicvoidinit()
該方法在Applet被瀏覽器載入內(nèi)存后自動(dòng)調(diào)用,通常用來(lái)初始化數(shù)據(jù)的值。本方法只在Applet首次裝入時(shí)被調(diào)用,并在調(diào)用start()方法前完成。假如要?jiǎng)?chuàng)建一個(gè)Applet生存期內(nèi)的線程,就可以在該方法中創(chuàng)建,在destory方法中結(jié)束?!駊ublicvoidstart()
當(dāng)init()方法完成后,瀏覽器會(huì)自動(dòng)調(diào)用start()方法。它的執(zhí)行使得Applet成為"活動(dòng)"的。并且每次Applet成為可見(jiàn)的時(shí),它都要執(zhí)行一次,如:當(dāng)瀏覽器在被最小化后又恢復(fù)時(shí),或者從其他web頁(yè)返回含有這個(gè)Applet的頁(yè)面時(shí)。通常我們把主要程序代碼寫(xiě)在這里,這一方法的典型用法是啟動(dòng)動(dòng)畫(huà)和播放聲音?!駊ublicvoidstop()
當(dāng)瀏覽器切換到另一個(gè)web頁(yè)面或?qū)⒁P(guān)閉時(shí),會(huì)自動(dòng)調(diào)用stop()方法。通常在該方法中加入一些暫停動(dòng)作,例如暫停音樂(lè)或動(dòng)畫(huà)的播放,以便用戶從其他Web頁(yè)面切換回包含該Applet的頁(yè)面時(shí),可以通過(guò)調(diào)用start()方法繼續(xù)播放下去?!駊ublicvoiddestroy()
用戶關(guān)閉瀏覽器時(shí),必須終止Applet的運(yùn)行,并回收資源。此時(shí),destroy()方法會(huì)自動(dòng)被調(diào)用。該方法是Applet在生存期中執(zhí)行的最后一個(gè)方法,所以通常在這里釋放一些在init()中分配的資源,如創(chuàng)建的線程等。瀏覽器在調(diào)用destory()方法時(shí),會(huì)先調(diào)用一次stop()方法?!駊ublicAudioClipgetAudioClip(URLurl)
返回由參數(shù)url所指定的AudioClip對(duì)象。AudioClip是一個(gè)音頻剪輯對(duì)象的接口,它提供了音頻對(duì)象的抽象控制。無(wú)論url指定的音樂(lè)文件是否存在,getAudioClip()方法都會(huì)很快返回值,因?yàn)橐纛l文件要等到播放的時(shí)候才下載。url參數(shù)指定的必須是一個(gè)絕對(duì)地址。●publicURLgetCodeBase()
返回Applet所在網(wǎng)址?!駊ublicURLgetDocumentBase()
返回包含該Applet對(duì)象的Web頁(yè)面的地址?!駊ublicImagegetImage(URLurl)
返回參數(shù)url所指定的圖片文件的Image對(duì)象。和getAudioClip()方法類似,不管指定地址的文件是否存在,getImage()方法都會(huì)立即返回值。圖片文件在Applet顯示在屏幕上時(shí)才會(huì)下載。url參數(shù)指定的必須是一個(gè)絕對(duì)地址?!駊ublicStringgetParameter(Stringname)
返回由HTML文件所提供的參數(shù)信息。Applet提供了從Web頁(yè)面文件中提取參數(shù)的方法,可以在HTML文件中通過(guò)<param>標(biāo)記設(shè)置一些參數(shù)供Applet使用,例如有如下的HTML代碼:<appletcode="Clock"width=50height=50> <paramname=Colorvalue="blue"></applet>
調(diào)用"getParameter("Color")"將返回"blue"。注意參數(shù)名是不區(qū)分大小寫(xiě)的。●publicBooleanisActive()
檢查Applet是否處于活動(dòng)狀態(tài)。當(dāng)瀏覽器調(diào)用start()方法時(shí),Applet即進(jìn)入活動(dòng)狀態(tài),而一旦stop()方法被調(diào)用,即進(jìn)入非活動(dòng)狀態(tài)?!駊ublicvoidplay(URLurl)
播放由參數(shù)url指定的音頻剪輯,如果該音頻剪輯不存在,則不做任何事情。url參數(shù)指定的必須是一個(gè)絕對(duì)地址●publicvoidshowStatus(Stringmsg)
在瀏覽器的狀態(tài)欄上顯示由參數(shù)msg指定的文字信息,以便通知用戶Applet的當(dāng)前狀態(tài)。通過(guò)第一節(jié)的例子,我們已經(jīng)明白了Applet運(yùn)行的方式和它的生命周期。下面我們通過(guò)實(shí)例來(lái)學(xué)習(xí)如何運(yùn)用以上方法寫(xiě)出有趣的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
這個(gè)例子展示了如何通過(guò)getImage()方法載入一個(gè)圖片對(duì)象,并將它顯示在瀏覽器中以及在啟動(dòng)Applet的時(shí)候播放一段音樂(lè)。首先,通過(guò)getParameter()方法從HTML代碼中提取出參數(shù),即Image和Audio文件的文件名。然后通過(guò)getImage()方法和getAudioClip()方法取得Image和Audio文件的對(duì)象。它們包括兩個(gè)參數(shù),getDocument()返回包含Applet的Web頁(yè)所在的地址,第二個(gè)參數(shù)getJava.gif指定圖片文件名。最后在start()方法中播放音樂(lè)。這樣,Applet每次啟動(dòng)時(shí)都會(huì)伴隨著一段音樂(lè)。在paint()方法中調(diào)用drawImage()方法顯示圖片,運(yùn)行時(shí)圖片getJava.gif和windowsstart.wav兩個(gè)文件必須和ShowImageApplet.html文件在同一目錄下,其運(yùn)行結(jié)果如圖12.4所示。
運(yùn)行結(jié)果如圖12.4所示。值的注意的是,如果通過(guò)圖片來(lái)源地址/getjava/images/getJava_head.gif來(lái)構(gòu)造一個(gè)URL對(duì)象,并通過(guò)getImage()方法載入它的話可能會(huì)引發(fā)一個(gè)訪問(wèn)違例。這是由于Applet的安全機(jī)制。前面已經(jīng)提到,Applet禁止:包含該Applet的Web頁(yè)面所在主機(jī)以外的其他任何機(jī)器通信。所以無(wú)法從其他的URL下載一個(gè)資源。12.1.4Applet標(biāo)記以下為Applet標(biāo)記的完整句法:<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>
這些標(biāo)記的意義如下:●archive=archiveList
這一可選屬性描述了一個(gè)或多個(gè)含有將被"預(yù)裝"的類和其他資源的archives。類的裝載由帶有給定codebase的AppletClassLoader的一個(gè)實(shí)例來(lái)完成。ArchiveList中的archives以逗號(hào)(,)分隔?!馽ode=appletFile.class
這是一個(gè)必需的屬性,它給定了含有已編譯好的Applet子類的文件名。也可用package.appletFile.class的格式來(lái)表示。注:這個(gè)文件與你要裝入的HTML文件的基URL有關(guān),它不能含有路徑名。要改變Applet的基URL,可使用<codebase>?!駑idth=pixelsheight=pixels
這些必需的屬性給出了Applet顯示區(qū)域的初始寬度和高度(以像素為單位),不包括Applet所產(chǎn)生的任何窗口或?qū)υ捒??!馽odebase=codebaseURL
這一可選屬性指定了Applet的基URL――包含有Applet代碼的目錄。如果這一屬性未指定,則采用文檔的URL。
●alt=alternateText
這一可選屬性指定了當(dāng)瀏覽器能讀取Applet標(biāo)記,但不能執(zhí)行JavaApplet時(shí)要顯示的文本?!駈ame=appletInstanceName
這個(gè)可選屬性為Applet實(shí)例指定有關(guān)名稱,從而使得在同一頁(yè)面上的Applet可找到彼此(以及互相通信)?!馻lign=alignment
這個(gè)可選屬性指定了Applet的對(duì)齊方式。它的可取值與基本的HTML中IMG標(biāo)記的相應(yīng)屬性相同,為left,right,top,texttop,middle,absmiddle,baseline,bottom和absbottom等?!駐space=pixelshspace=pixels
這些可選屬性指定了在Applet上下(vspace)及左右(hspace)的像素?cái)?shù)目。其用法與IMG標(biāo)記的vspace和hspace屬性相同?!?lt;paramname=appletAttribute1value=value>
這個(gè)標(biāo)記提供了一種可帶有由"外部"指定的數(shù)值的Applet,它對(duì)一個(gè)Java應(yīng)用程序的作用與命令行參數(shù)相同。Applet用getParameter()方法來(lái)存取它們的屬性,該方法將在稍后作更詳細(xì)的討論。不支持Java程序執(zhí)行的瀏覽器將顯示被包括在<applet>和</applet>標(biāo)記之間的任何常規(guī)的HTML;而可支持Java技術(shù)的瀏覽器則忽略介于這兩個(gè)標(biāo)記之間的HTML代碼。12.1.5從Applet中彈出窗口有時(shí)候我們可能覺(jué)得瀏覽器的界面不利于布局管理,一個(gè)浮在頂端的窗口或?qū)υ捒蚋芤俗⒛?。?shí)際上,確實(shí)可以從Applet程序中彈出一個(gè)如同應(yīng)用程序一般的窗口來(lái)。這有時(shí)也有利于我們將現(xiàn)成的應(yīng)用程序轉(zhuǎn)成小應(yīng)用程序,如果我們只是僅僅想它通過(guò)瀏覽器下載運(yùn)行,而不需要做太多功能上的調(diào)整,從Applet程序中彈出一個(gè)窗口也許是個(gè)好的解決辦法,也就是給它披上一個(gè)Applet的外殼。下面這個(gè)例子是一個(gè)小型的計(jì)算器的程序,它通過(guò)Applet的一個(gè)按鍵彈出一個(gè)Frame,而計(jì)算器功能的實(shí)現(xiàn)都在Frame中。Applet的功能僅僅是從瀏覽器啟動(dòng)它,僅僅是它的一層外殼。例12.4CalculatorApplet.javaimportjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassCalculatorAppletextendsApplet implementsActionListener{ //彈出的窗口
privateFramecalcFrame=newCalculatorFrame(); publicvoidinit(){ //彈出的按鍵
ButtoncalcButton=newButton("Calculator"); calcButton.addActionListener(this); add(calcButton); } publicvoidactionPerformed(ActionEventevt) { //彈出窗口如果沒(méi)有被顯示,則顯示它,否則關(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ù)字按鍵盤(pán)
Panelkeypad=newPanel();Panelkeypad=newPanel(); keypad.setLayout(newGridLayout(4,4)); //添加數(shù)字和運(yùn)算符按鍵
Stringkeys="789/456*123-0.=+"; for(inti=0;i<keys.length();i++) { Buttonbtn=newButton(keys.substring(i,i+1)); keypad.add(btn);//為按鍵添加事件監(jiān)聽(tīng)器
btn.addActionListener(this); } add(keypad,"Center");}
publicvoidactionPerformed(ActionEventevt) { //響應(yīng)按鍵,如果是數(shù)字則連接到StringBuffer中,
//如果是運(yùn)算符則進(jìn)行運(yùn)算。
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) {//計(jì)算
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); }}
這個(gè)窗口是一個(gè)功能簡(jiǎn)陋的計(jì)算器面板。由于只需給它配上最簡(jiǎn)單的HTML代碼,所以這里不再列出。圖12.5是該程序的運(yùn)行結(jié)果。
圖12.5
彈出窗口Applet
我們注意到,在彈出窗口的最底下有一行字"JavaAppletWindow",這是對(duì)這個(gè)窗口的一個(gè)說(shuō)明,也是所有瀏覽器都具備的一個(gè)安全特性。它提示用戶這是一個(gè)由運(yùn)行于瀏覽器的Applet彈出的窗口,而不是從機(jī)器上運(yùn)行的一個(gè)程序。試想如你運(yùn)行了一個(gè)惡意的Applet程序,它可能會(huì)彈出一個(gè)窗口,這個(gè)窗口與你本地某個(gè)需要輸入賬號(hào)、密碼的應(yīng)用程序有著相同的界面,也許你會(huì)被它蒙蔽而錯(cuò)誤性的輸入了信息,這個(gè)Applet就會(huì)把這些信息送回主機(jī)。
為了避免這種惡作劇出現(xiàn),所有的彈出窗口都在底端顯示一個(gè)標(biāo)簽,警告用戶這是一個(gè)小應(yīng)用程序,而不是本地應(yīng)用程序。當(dāng)然,如果你制作一個(gè)簽名的小應(yīng)用程序并得到了用戶的信任,則可以不顯示這個(gè)警告標(biāo)簽。值的一題的是,正如前面所說(shuō),這個(gè)小應(yīng)用程序只是通過(guò)Applet來(lái)啟動(dòng)了一個(gè)彈出窗口,如果在CalculatorApplet類中為它加入一個(gè)mian()方法的話,它就可以同時(shí)作為Applet和應(yīng)用程序來(lái)運(yùn)行,大家可以自己試試。12.1.6基于Swing與AWT的Applet的區(qū)別我們已經(jīng)知道,Applet類是從AWT包中的Panel類派生的,而Java2提供的新一代GUI設(shè)計(jì)包Swing也提供了支持Applet設(shè)計(jì)的類:javax.swing.Japplet。注意,JApplet類并不是從JPanel類派生的,而是直接從java.applet.Applet類派生出來(lái)的。用AWT設(shè)計(jì)小應(yīng)用程序時(shí),我們從java.applet.Applet類派生一個(gè)子類,現(xiàn)在為了使用Swing包,就必須從avax.swing.JApplet類派生子類。讓我們先來(lái)看一個(gè)基于JApplet類的小應(yīng)用程序的實(shí)例,然后再分析二者的區(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); }}
該程序的運(yùn)行結(jié)果如圖12.6所示。在該程序中,為小應(yīng)用程序加入了一個(gè)菜單條,這也是基于Swing的小應(yīng)用程序的一種新特性。圖12.6
從上面的例子來(lái)看,基于Swing的小應(yīng)用程序和基于AWT的小應(yīng)用程序在架構(gòu)上沒(méi)有什么分別,它們的生存方式也是相同的,所以上述例子中也沒(méi)有給出start(),stop(),destory()這些方法,而是使用了默認(rèn)的方法,但是,有幾點(diǎn)需要注意:
(1)JApplet類默認(rèn)使用BorderLayout作為其容器的布局管理器,其默認(rèn)約束條件是BordenLayout.CENTER,而Applet的缺省的布局管理器是FlowLayout,且FlowLayout的缺省約束條件是FlowLayout.LEFT,這是二者最顯著的區(qū)別之一。(2)JApplet是只包含一個(gè)組件的容器,這個(gè)組件就是JRootPane的一個(gè)實(shí)例,而JRootPane包含了一個(gè)稱作內(nèi)容窗格的容器。
(3)"內(nèi)容窗格"包含與特定的小應(yīng)用程序有關(guān)的所有內(nèi)容,可通過(guò)getContentPane()方法獲得。即是說(shuō),小應(yīng)用程序必須把所有的組件添加到內(nèi)容窗格中,而Applet則是把它們直接添加到小應(yīng)用程序中。
(4)我們不能直接為小應(yīng)用程序設(shè)置布局管理器,而只能對(duì)它的內(nèi)容窗格設(shè)置布局管理。
(5)JApplet的實(shí)例可以有一個(gè)菜單欄,它是由setJMenuBar()方法指定的,而AWT小應(yīng)用程序卻不能。
基于Swing的小應(yīng)用程序比基于AWT的小應(yīng)用程序有更多的優(yōu)勢(shì),它可以使用Swing提供的更多界面元素和性能。但是它也有一個(gè)很大的缺陷,那就是很多瀏覽器都不能支持Swing編寫(xiě)的小應(yīng)用程序,而必須依靠安裝JavaPlug-in包。雖然可以讓瀏覽器在運(yùn)行Swing小應(yīng)用程序時(shí)自動(dòng)下載這個(gè)包,但是由于JavaPlug-in包并不小,所以對(duì)于非寬帶上網(wǎng)的用戶來(lái)說(shuō)是不可忍受的。12.2Applet的通信12.2.1Applet與瀏覽器的通信我們已經(jīng)學(xué)習(xí)過(guò)如何通過(guò)getParameter()方法從瀏覽器的Web頁(yè)中獲取信息,同時(shí),Applet也可以要求瀏覽器為自己做事,例如我們可以讓瀏覽器打開(kāi)一個(gè)指定的Web頁(yè)。為了與瀏覽器通信,需調(diào)用Applet的getAppletContext()方法。這個(gè)方法返回一個(gè)實(shí)現(xiàn)了AppletContext接口的對(duì)象,這個(gè)接口是實(shí)現(xiàn)Applet和瀏覽器通信的一座橋梁。
除了getAudioClip()和getImage()外,AppletContext接口還提供了四個(gè)有用的方法,它們是get-Applet()、getStream()、showDocument()和showStatus(),我們將在本節(jié)和下面的小節(jié)中講述它們的用法。在小應(yīng)用程序中可以訪問(wèn)瀏覽器的兩個(gè)區(qū):狀態(tài)行和頁(yè)面顯示區(qū),但都必須通過(guò)調(diào)用AppletContext接口中的方法來(lái)實(shí)現(xiàn)。通過(guò)調(diào)用showStatus(Stringstatus)方法,可以在瀏覽器底部的狀態(tài)行中顯示一行字符串提示信息,例如:
showStatus("LoadingData…pleasewait");
但是,遺憾的是,使用showStatus()顯示提示信息的功能很有限,因?yàn)闉g覽器自己也在使用狀態(tài)行,而且經(jīng)常使用。它總是用新的提示信息改寫(xiě)前一次的信息,用戶往往無(wú)法注意到某一條信息,所以不能用該方法來(lái)顯示一些重要信息。在瀏覽器頁(yè)面顯示區(qū)顯示信息的方法是showDocument(),它可以通知瀏覽器打開(kāi)一個(gè)指定的URL資源。showDocument()方法的定義如下:
showDocument(URLurl);
showDocument(URLurl,Stringtarget);
第一種格式的調(diào)用可以讓瀏覽器直接打開(kāi)一個(gè)新的URL資源,并將它顯示在當(dāng)前瀏覽器顯示區(qū)中,替換原來(lái)顯示的Web頁(yè)面。第二種格式的調(diào)用多了一個(gè)String類型的參數(shù),第一個(gè)參數(shù)依然是指定要顯示的URL資源,第二個(gè)參數(shù)則用于指明瀏覽器打開(kāi)頁(yè)面的方式。如果指定值為"_blank",瀏覽器就會(huì)另外打開(kāi)一個(gè)新窗口,在新的瀏覽器窗口中顯示指定的Web頁(yè)。如果使用HTML3.2以上版本提供的幀特性,則可以將一個(gè)瀏覽器的窗口分成多個(gè)幀,并給每個(gè)幀指定一個(gè)名字。用戶可以把自己的Applet放入一個(gè)幀中,并利用它來(lái)控制其他幀的頁(yè)面顯示。表12.2展示了可以用作ShowDocument()方法的第二個(gè)參數(shù)的所有字符串及其功能。表12.2showDocument參數(shù)showDocument()的兩個(gè)參數(shù)位置“_self”或無(wú)顯示在當(dāng)前幀內(nèi)“_parent”顯示在父容器幀內(nèi)“_top”顯示在頂層幀內(nèi)“_blank”顯示在一個(gè)新打開(kāi)的瀏覽器窗口中其他字符顯示在該字符串指定名的幀內(nèi),如果沒(méi)有該幀,就打開(kāi)一個(gè)新窗口顯示,并把這個(gè)名稱指定給他例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>
這個(gè)小應(yīng)用程序利用了HTML3.2以上版本的窗口分幀的特性,將瀏覽器的頁(yè)面顯示區(qū)垂直地分成了兩個(gè)幀。左邊的幀包含了上面的Bookmark小應(yīng)用程序,它在一個(gè)列表框中列出了一列網(wǎng)址。點(diǎn)擊其中任何一個(gè)網(wǎng)址,就會(huì)在右邊的幀中顯示出相應(yīng)的Web頁(yè)來(lái)。這個(gè)功能類似收藏夾的小應(yīng)用程序在瀏覽器中運(yùn)行,結(jié)果如圖12.7所示。圖12.712.2.2同頁(yè)Applet之間的通信我們已經(jīng)學(xué)習(xí)了如何在一個(gè)Web頁(yè)面中嵌入Applet,實(shí)際上,完全可以在同一個(gè)Web頁(yè)上嵌入一個(gè)以上的小應(yīng)用程序,甚至還可以讓這些Applet互相通信,互相控制。要實(shí)現(xiàn)Web頁(yè)中的不同Applet之間的通信,這些Applet的codebase必須是相同的,即它們的class文件放在服務(wù)器上的同一路徑下。Applet之前的通信是一個(gè)高級(jí)技巧。我們還記得在嵌入小應(yīng)用程序的<applet>標(biāo)記中有一個(gè)name參數(shù),我們可以通過(guò)這個(gè)參數(shù)為嵌入的小應(yīng)用程序賦予一個(gè)名字。然后調(diào)用AppletContext接口的getApplet()方法,獲得對(duì)這個(gè)小應(yīng)用程
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度美團(tuán)團(tuán)購(gòu)服務(wù)合同范本升級(jí)版8篇
- 二零二五年度高空作業(yè)腳手架租賃與施工總承包合同3篇
- 2025版協(xié)議離婚特殊規(guī)定及婚姻財(cái)產(chǎn)分割與子女撫養(yǎng)合同3篇
- 2025版臨時(shí)工特殊工種作業(yè)安全協(xié)議書(shū)4篇
- 2025年度酒店式公寓房間長(zhǎng)期租賃服務(wù)協(xié)議3篇
- 2025年度個(gè)人企業(yè)全額承包經(jīng)營(yíng)合作協(xié)議范本4篇
- 2025年度新能源電池殼體模具開(kāi)發(fā)與加工服務(wù)協(xié)議4篇
- 2025年度文化創(chuàng)意園區(qū)場(chǎng)地租賃安全管理與文化創(chuàng)新合同4篇
- 水電消防工程2025年度施工及進(jìn)度管理合同2篇
- 2025新生入學(xué)教育法律協(xié)議書(shū)(定制版)2篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 二手車車主寄售協(xié)議書(shū)范文范本
- 窗簾采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語(yǔ)文單元整體教學(xué)設(shè)計(jì)策略的探究
- 人教版高中物理必修一同步課時(shí)作業(yè)(全冊(cè))
- 食堂油鍋起火演練方案及流程
- 《呼吸衰竭的治療》
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識(shí)點(diǎn)總結(jié)(重點(diǎn)標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論