《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第8章_第1頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第8章_第2頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第8章_第3頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第8章_第4頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)案例教程》課件第8章_第5頁(yè)
已閱讀5頁(yè),還剩84頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章Apple程序8.1Apple程序的基本概念8.2在Apple程序中繪圖8.3Apple多媒體程序的設(shè)計(jì)第8章Applet程序?qū)W習(xí)目標(biāo)

理解Applet程序的概念;

掌握Applet程序的編寫(xiě)方法;

了解Applet程序的生命周期;

學(xué)會(huì)在Applet程序中繪制圖形和設(shè)置字體;

了解Applet多媒體程序的設(shè)計(jì)。

Java技術(shù)之所以如此熱門(mén),其根本原因在于Java具有“讓Internet動(dòng)起來(lái)”的能力。具體來(lái)說(shuō),就是Java能創(chuàng)建一種被稱(chēng)做“小應(yīng)用程序”(Applet)的特殊類(lèi)型程序,使具備運(yùn)行Java程序的Web瀏覽器可以從網(wǎng)絡(luò)上下載這種程序,然后在瀏覽器窗口中運(yùn)行。盡管,目前的Java與其剛剛問(wèn)世的時(shí)候相比有多種技術(shù)可以實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)技術(shù),但由于小應(yīng)用程序是一種全功能的程序,因此它仍然具有應(yīng)用前景?;炯寄?.1Applet程序的基本概念前面各章介紹的程序都是在單機(jī)上可以單獨(dú)運(yùn)行的Java程序,這種程序叫Java應(yīng)用程序(Aapplication)。JavaApplet程序是一種在網(wǎng)絡(luò)環(huán)境下,嵌入網(wǎng)頁(yè)執(zhí)行的Java程序。本節(jié)介紹有關(guān)Applet程序的設(shè)計(jì)知識(shí)。8.1.1Applet程序

Applet程序也叫“Java小應(yīng)用程序”,它是一種能夠嵌入到一個(gè)HTML頁(yè)面中,并且可以由支持Java的Web瀏覽器來(lái)解釋執(zhí)行的一種Java類(lèi)。Applet程序的工作過(guò)程可以用圖8-1表示。圖8-1Applet程序的工作過(guò)程當(dāng)瀏覽器打開(kāi)一個(gè)含有Applet程序的Web頁(yè)面時(shí),Applet程序就被從Web服務(wù)器下載到瀏覽器中,瀏覽器讀取到Applet程序的字節(jié)代碼文件后,自動(dòng)啟動(dòng)Java解釋器將字節(jié)代碼轉(zhuǎn)化為本地機(jī)器指令,并在瀏覽器窗口中運(yùn)行,運(yùn)行結(jié)果將顯示在瀏覽器窗口中。讀者要注意的是,IE6等版本的瀏覽器在沒(méi)有安裝Java之前,不能運(yùn)行網(wǎng)頁(yè)中所嵌入的Applet程序,只要安裝JavaJDK時(shí)選擇安裝運(yùn)行Java程序的解釋器插件(JavaPlug-in),就可以解決該問(wèn)題。由于Applet在Web瀏覽器環(huán)境中運(yùn)行,因此它并不直接由鍵盤(pán)輸入的一個(gè)命令來(lái)啟動(dòng)。使用Applet時(shí),必須創(chuàng)建一個(gè)HTML文件,將Applet字節(jié)代碼文件嵌入HTML文件中,用來(lái)告訴瀏覽器需裝載哪個(gè)Applet字節(jié)代碼文件。在HTML網(wǎng)頁(yè)中嵌入Applet字節(jié)代碼的標(biāo)記是:<APPLETCODE="applet字節(jié)代碼文件名.class"WIDTH="窗口寬度"HEIGHT="窗口高度"></APPLET>其中,WIDTH和HEIGHT分別表示Applet程序在瀏覽器中所顯示窗口的寬度和高度。一個(gè)Applet程序在瀏覽器中的執(zhí)行步驟是:●瀏覽器裝入U(xiǎn)RL;●瀏覽器下載HTML文檔;●瀏覽器裝入Applet類(lèi);●啟動(dòng)JVM運(yùn)行Applet。8.1.2Applet程序的結(jié)構(gòu)與生命周期

1.?Applet程序的結(jié)構(gòu)由于Applet程序是嵌入網(wǎng)頁(yè)中被執(zhí)行的特殊Java程序,因此Applet程序的結(jié)構(gòu)與Application程序的結(jié)構(gòu)有較大的不同。根據(jù)人們?yōu)g覽網(wǎng)頁(yè)的特點(diǎn),Java語(yǔ)言的設(shè)計(jì)者已經(jīng)為Applet程序設(shè)計(jì)好了程序結(jié)構(gòu),并將其放到了一個(gè)名叫“Applet”的類(lèi)中,Applet類(lèi)在“java.applet”包中。因此,要?jiǎng)?chuàng)建一個(gè)Applet程序,必須繼承Applet類(lèi),一般的創(chuàng)建格式如下:importjava.applet.Applet;publicclassHelloWorldextendsApplet{…}

Applet程序類(lèi)必須為公共的(public),且它的程序文件名稱(chēng)必須與類(lèi)名一致。如類(lèi)名為“HelloApplet”時(shí),源程序的文件名則必須為“HelloApplet.java”。

2.?Applet類(lèi)的主要方法與Applet的生命周期

Applet類(lèi)提供了使Applet程序在瀏覽器上執(zhí)行的骨干結(jié)構(gòu),主要由init、start、stop和destroy這四個(gè)方法所構(gòu)成。利用Applet類(lèi)提供的這些方法可以構(gòu)造任意的Applet程序。在實(shí)際應(yīng)用中,用戶(hù)可以通過(guò)重寫(xiě)這些方法來(lái)構(gòu)造自己的Applet程序,根據(jù)需要可以重寫(xiě)這四個(gè)方法中的個(gè)別方法,或全部重寫(xiě)。

Applet的生命周期有四個(gè)狀態(tài):初始狀態(tài)、啟動(dòng)狀態(tài)、停止?fàn)顟B(tài)和消亡狀態(tài),這四種狀態(tài)分別與init、start、stop和destroy這四個(gè)方法的執(zhí)行對(duì)應(yīng),如圖8-2所示。另外,如果要在Applet程序中顯示字符串或繪圖,則還要使用Applet的paint方法。圖8-2Applet程序的生命周期

1)?init方法當(dāng)小應(yīng)用程序第一次被支持Java的瀏覽器加載時(shí),在瀏覽器中運(yùn)行Java時(shí)系統(tǒng)會(huì)自動(dòng)創(chuàng)建該Applet程序類(lèi)的一個(gè)實(shí)例,并調(diào)用該實(shí)例的init方法。在小應(yīng)用程序的生命周期中,該方法只執(zhí)行一次,因此可以在其中進(jìn)行一些只執(zhí)行一次的初始化操作,如初始化變量、加載圖像和聲音文件等。

2)?start方法系統(tǒng)在執(zhí)行完init方法之后,將自動(dòng)調(diào)用start方法。另外,每當(dāng)瀏覽器從圖標(biāo)恢復(fù)為窗口時(shí),或者用戶(hù)離開(kāi)包含該小應(yīng)用程序的主頁(yè)后又返回該頁(yè)面時(shí),系統(tǒng)都會(huì)再執(zhí)行一遍start方法。start方法在小應(yīng)用程序的生命周期中可能被調(diào)用多次,以啟動(dòng)小應(yīng)用程序的執(zhí)行,這一點(diǎn)與init方法不同。該方法是小應(yīng)用程序的主體,在其中可以執(zhí)行一些需要重復(fù)執(zhí)行的任務(wù),例如開(kāi)始播放動(dòng)畫(huà)或聲音等。

3)?paint方法在start()方法執(zhí)行后,就會(huì)自動(dòng)執(zhí)行paint方法;或者在將覆蓋Applet程序窗口的其他窗口移開(kāi)時(shí)(即窗口需要重繪),paint方法也會(huì)被自動(dòng)調(diào)用。在Applet程序中要顯示一些信息或進(jìn)行圖形繪制時(shí),這些操作通常放在paint方法中。

4)?stop方法與start()方法相反,當(dāng)用戶(hù)離開(kāi)小應(yīng)用程序所在頁(yè)面或?yàn)g覽器變成圖標(biāo)時(shí),會(huì)自動(dòng)調(diào)用stop()方法。因此,該方法在小應(yīng)用程序的生命周期中也被多次調(diào)用。這樣使得在用戶(hù)并不注意小應(yīng)用程序的時(shí)候,停止一些耗用系統(tǒng)資源的工作,以免影響系統(tǒng)的運(yùn)行速度。如果一個(gè)小應(yīng)用程序中不包含動(dòng)畫(huà)、聲音等程序,通常不必重寫(xiě)該方法。

5)?destroy方法瀏覽器正常關(guān)閉時(shí),Java自動(dòng)調(diào)用destroy方法。destroy方法用于釋放系統(tǒng)資源。如果這個(gè)小應(yīng)用程序仍然處于活動(dòng)狀態(tài),則Java會(huì)在調(diào)用destroy方法之前先調(diào)用stop方法。8.1.3一個(gè)簡(jiǎn)單的JavaApplet程序下面通過(guò)一個(gè)簡(jiǎn)單的Applet程序來(lái)了解Applet程序的執(zhí)行過(guò)程。該程序在瀏覽器上顯示“Hello,Applet!”的字樣。程序代碼如下:01//實(shí)例8-1:一個(gè)簡(jiǎn)單的Applet程序(HelloApplet.java)02importjava.awt.Graphics;

//引入圖形類(lèi)Graphics03importjava.applet.Applet;//引入Applet類(lèi)04publicclassHelloAppletextendsApplet{05Strings;06publicvoidinit(){//init()方法是Applet首先執(zhí)行的方法07s="Hello,Applet!";//將s初始化08}09publicvoidpaint(Graphicsg){10g.drawString(s,70,80);//在坐標(biāo)為(70,80)的地方顯示字符串s11}12}該程序的02行引入09行定義的paint方法參數(shù)中要使用的Graphics類(lèi),該類(lèi)在java.awt包中。03行引入Applet類(lèi),07行在方法init中將字符串s進(jìn)行了初始化,09行重寫(xiě)了paint方法,10行調(diào)用圖形類(lèi)Graphics的drawString方法在指定位置輸出字符串s。在網(wǎng)頁(yè)中嵌入該Applet的方法是:

(1)將該Applet程序編譯成字節(jié)代碼文件。

Applet程序編寫(xiě)完成后,用Java編譯器(javac.exe程序)將其編譯成擴(kuò)展名為.class的字節(jié)代碼文件。

(2)在HTML文件中嵌入Applet字節(jié)代碼。編譯好的Applet程序字節(jié)代碼文件要嵌入HTML文件中才能被執(zhí)行。將該例中Applet程序嵌入HTML文件HelloAppletd.html中的代碼如下:<HTML><APPLETCODE="HelloApplet.class"WIDTH=200HEIGHT=100></APPLET></HTML>

(3)在瀏覽器上執(zhí)行HTML文件。在資源管理器中雙擊“HelloAppletd.html”文件,即可在瀏覽器上看到Applet程序的執(zhí)行結(jié)果。另外,為了方便調(diào)試程序,JDK中還提供了一個(gè)工具程序appletviewer.exe,該程序?qū)iT(mén)用來(lái)調(diào)試與執(zhí)行Applet程序。其應(yīng)用格式如下:appletviewer文件名.html其實(shí),要快速調(diào)試Applet程序還有一種方法,就是將上述HTML文件以注釋的形式加到Applet源程序的開(kāi)始處。其格式如下://<HTML>//<APPLETCODE="HelloApplet.class"WIDTH=200HEIGHT=100>//</APPLET>//</HTML>importjava.awt.Graphics;

//引入圖形類(lèi)Graphics…然后在DOS狀態(tài)下,用如下的命令執(zhí)行即可:appletviewerHelloApplet.java這種方法可以不用單獨(dú)編寫(xiě)一個(gè)HTML文件去調(diào)試Applet程序。最后要說(shuō)明一點(diǎn),用戶(hù)在程序中并沒(méi)有創(chuàng)建一個(gè)上例中HelloApplet類(lèi)的實(shí)例,那么該程序是如何被執(zhí)行的呢?其實(shí),在瀏覽器載入Applet程序時(shí),就自動(dòng)創(chuàng)建了一個(gè)該Applet的實(shí)例,瀏覽器運(yùn)行Java時(shí),系統(tǒng)就會(huì)根據(jù)前面介紹的Applet的生命周期,自動(dòng)調(diào)用相應(yīng)的方法。paint方法有個(gè)Graphics類(lèi)型的參數(shù),該方法在被系統(tǒng)自動(dòng)調(diào)用時(shí),也會(huì)由系統(tǒng)自動(dòng)生成一個(gè)Graphics類(lèi)型的實(shí)例作為該方法的實(shí)參,該實(shí)例就代表Applet程序在瀏覽器上的窗口。8.1.4【相關(guān)知識(shí)】Applet程序與Application程序的比較

Applet程序與Application程序的比較如表8-1所示。表8-1Applet程序與Application程序的比較有時(shí)需要實(shí)現(xiàn)這樣一個(gè)Java程序文件,它既可作為應(yīng)用程序運(yùn)行,又可作為小應(yīng)用程序運(yùn)行。我們可以設(shè)計(jì)一個(gè)程序,使其具有Applet程序與Application程序的雙重身份。設(shè)計(jì)思想是創(chuàng)建一個(gè)小應(yīng)用程序,而這個(gè)小應(yīng)用程序包含一個(gè)main方法,如實(shí)例8-2所示。01//實(shí)例8-2:具有雙重身份的Applet程序(AppletApp.java)02//<HTML>03//<APPLETCODE="AppletApp.class"WIDTH="200"HEIGHT="100">04//</APPLET>05//</HTML>06importjava.applet.Applet;07importjava.awt.Graphics;08publicclassAppletAppextendsApplet{09staticStrings1=newString(“這是Application程序運(yùn)行的結(jié)果!");10staticStrings2=newString(“這是Applet程序運(yùn)行的結(jié)果!");11publicstaticvoidmain(Stringargs[]){12System.out.println(s1);13}//main函數(shù)結(jié)束14publicvoidpaint(Graphicsg){15g.drawString(s2,25,25);16}17}實(shí)例的第11~13行是Java應(yīng)用程序的main()函數(shù),在main()函數(shù)中輸出了該類(lèi)定義的靜態(tài)字符串s1。第14~16行重寫(xiě)了paint方法,該方法的15行在瀏覽器窗口中輸出該類(lèi)定義的靜態(tài)字符串s2。該實(shí)例的運(yùn)行結(jié)果如圖8-3所示。其中,8-3(a)圖是以Application方式運(yùn)行的結(jié)果,8-3(b)圖是以Applet方式運(yùn)行的結(jié)果。圖8-3實(shí)例8-2運(yùn)行的結(jié)果(a)(b)8.2在Applet程序中繪圖在Applet程序中可以繪制一些簡(jiǎn)單的圖形。本節(jié)介紹一些在程序中繪圖的基本知識(shí)和與圖形繪制有關(guān)的Graphics類(lèi)的用法。8.2.1與繪圖有關(guān)的類(lèi)

1.屏幕坐標(biāo)圖8-4屏幕坐標(biāo)在計(jì)算機(jī)顯示器上繪圖時(shí),首先要確定圖形在平面坐標(biāo)系中的位置。與傳統(tǒng)的坐標(biāo)系有所不同,一般在程序設(shè)計(jì)中將顯示器的左上角定義為坐標(biāo)原點(diǎn),且在這個(gè)坐標(biāo)系中所有可見(jiàn)的區(qū)域內(nèi),坐標(biāo)都是正數(shù),如圖8-4所示。在Java程序中,每個(gè)點(diǎn)用一對(duì)整型數(shù)據(jù)表示,如圖8-4所示的點(diǎn)P(x,y)。屏幕左上角的坐標(biāo)原點(diǎn)為(0,0),x軸的方向向右,y軸的方向向下。坐標(biāo)的單位是像素。圖8-4屏幕坐標(biāo)

2.?Graphics類(lèi)

Graphics類(lèi)是Java類(lèi)庫(kù)中提供的一個(gè)用于圖形繪制的類(lèi)。在屏幕上繪圖就要使用Java的圖形環(huán)境,Graphics類(lèi)的對(duì)象就是專(zhuān)門(mén)用來(lái)管理圖形環(huán)境的,并提供了各種圖形繪制的方法。由于Java語(yǔ)言是一種跨平臺(tái)的語(yǔ)言,在各種不同的平臺(tái)上運(yùn)行的Java程序其繪圖環(huán)境差別很大,因此無(wú)法定義一個(gè)具體的繪圖類(lèi)。正因?yàn)槿绱?,Graphics類(lèi)被定義成了一個(gè)抽象類(lèi),該抽象類(lèi)中主要定義了一些繪制圖形(如畫(huà)線(xiàn)、矩形、圓等)的方法,這些方法給程序員提供了一個(gè)統(tǒng)一的與平臺(tái)無(wú)關(guān)的繪圖接口。而這些方法則由不同平臺(tái)上的Java運(yùn)行時(shí)環(huán)境來(lái)實(shí)現(xiàn)。在需要繪圖時(shí),Java運(yùn)行時(shí)環(huán)境會(huì)創(chuàng)建一個(gè)Graphics類(lèi)的子類(lèi)的實(shí)例來(lái)實(shí)現(xiàn)繪圖功能,而用戶(hù)不需要關(guān)心這個(gè)過(guò)程。若要在Applet程序中使用Graphics類(lèi)進(jìn)行圖形繪制,則可以使用Applet類(lèi)提供的getGraphics()方法取得一個(gè)繪圖類(lèi)對(duì)象。但要注意,由于Graphics類(lèi)是一個(gè)抽象類(lèi),因此不能在程序中直接創(chuàng)建該類(lèi)的對(duì)象。

Graphics類(lèi)中定義的圖形繪制方法,主要可以繪制如下幾種圖形:●繪制直線(xiàn);●繪制矩形;●繪制橢圓;●繪制圓弧;●繪制多邊形。

1)繪制直線(xiàn)——drawLine繪制直線(xiàn)的方法為:publicabstractvoiddrawLine(intx1,inty1,intx2,inty2);該方法在圖形坐標(biāo)系統(tǒng)中,使用當(dāng)前顏色在點(diǎn)(x1,y1)和點(diǎn)(x2,y2)之間畫(huà)一條線(xiàn),如圖8-5(a)所示。

2)繪制矩形——drawRect繪制矩形的方法為:publicvoiddrawRect(intx,inty,intwidth,intheight);該方法繪制指定矩形的邊框,矩形的左邊和右邊位置分別是x和x+width,頂邊和底邊位置分別是y和y+height,如圖8-5(b)所示(圖中width用w表示,height用h表示)。如果要用當(dāng)前顏色填充指定的矩形,則要使用fillRect方法,該方法與drawRect方法的參數(shù)相同。該矩形左邊和右邊位置分別是x和x+width-1,邊和底邊位置分別是y和y+height-1,得到的矩形覆蓋區(qū)域?qū)挾葹閣idth個(gè)像素,高度為height個(gè)像素。

3)繪制圓角矩形——drawRoundRect繪制圓角矩形的方法為:publicabstractvoiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight);圓角矩形的左邊和右邊位置分別是x和x+width,頂邊和底邊位置分別是y和y+height,arcWidth表示4個(gè)角弧度的水平直徑,arcHeight表示4個(gè)角弧度的垂直直徑,如圖8-5(c)所示(圖中aw表示arcWidth,ah表示arcHeight)。

4)繪制橢圓——drawOval繪制橢圓的方法為:publicabstractvoiddrawOval(intx,inty,intwidth,intheight);該方法可以繪制一個(gè)圓或橢圓,它恰好位于由x、y、width和height參數(shù)指定的矩形內(nèi),如圖8-5(d)所示。如果要用當(dāng)前顏色填充指定的橢圓,則要使用fillOval方法,該方法與drawOval方法的參數(shù)相同。

5)繪制圓弧——drawArc繪制圓弧的方法為:publicabstractvoiddrawArc(intx,inty,int,int,intstartAngle,intarcAngle);該方法繪制由startAngle角度開(kāi)始,到arcAngle角度為止的一個(gè)弧線(xiàn)。該弧線(xiàn)的外切矩形左上角坐標(biāo)是(x,y),寬和高分別為width和height,0角度位于水平方向,角度為正值表示逆時(shí)針旋轉(zhuǎn),為負(fù)值表示順時(shí)針旋轉(zhuǎn),如圖8-5(e)所示??梢允褂胒illArc方法繪制一個(gè)實(shí)心扇形區(qū)域。

6)繪制多邊形——drawPolygon繪制多邊形的方法為:publicabstractvoiddrawPolygon(int[]xPoints,int[]yPoints,intnPoints);該方法繪制一個(gè)由x和y坐標(biāo)數(shù)組定義的閉合多邊形,每對(duì)(x,y)坐標(biāo)定義了一個(gè)點(diǎn),如圖8-5(f)所示??梢允褂胒illPolygon方法繪制一個(gè)實(shí)心多邊形。圖8-5Graphics類(lèi)中繪圖方法示意圖

3.?Color類(lèi)在繪制各種圖形時(shí),為了使色彩豐富,可以使用Java類(lèi)庫(kù)中java.awt包里定義的Color類(lèi)。該類(lèi)中主要定義了一些顏色常量和與顏色操作有關(guān)的一些方法。常用的一些顏色常量為:staticColorBLACK:黑色staticColorBLUE:藍(lán)色staticColorCYAN:青色staticColorDARK_GRAY:深灰色staticColorGRAY:灰色staticColorGREEN:綠色staticColorLIGHT_GRAY:淺灰色staticColorORANGE:桔黃色staticColorPINK:粉紅色staticColorRED:紅色staticColorWHITE:白色staticColorYELLOW:黃色Color類(lèi)提供的主要構(gòu)造方法是:Color(intr,intg,intb)表示用指定的紅色、綠色和藍(lán)色值(在0~255范圍內(nèi))創(chuàng)建一種不透明的顏色對(duì)象,例如:Colorc=newColor(255,0,0);創(chuàng)建了一種紅色對(duì)象??梢允褂肎raphics類(lèi)的setColor方法設(shè)置當(dāng)前的繪圖顏色;可以使用Graphics類(lèi)的getColor方法取得當(dāng)前的繪圖顏色。

4.?Font類(lèi)通過(guò)Font類(lèi)可以設(shè)置組件或所畫(huà)對(duì)象的字體,F(xiàn)ont類(lèi)在java.awt包中。創(chuàng)建Font類(lèi)對(duì)象的語(yǔ)法為:FontmyFont=Font(name,style,size);字體名name為字符串類(lèi)型,可選擇ScanSerif、Serif、Monospaced、Dialog或DialogInput等。字型style為整型數(shù),為方便起見(jiàn),可選擇Font類(lèi)中定義的表示字型的常量,如Font.PLAIN(普通)、Font.BOLD(黑體)、Font.ITALIC(斜體)等,字型可以組合使用。字體大小用整型量size表示。例如:FontmyFont=newFont("SansSerif",Font.BOLD,16);FontmyFont=newFont("Serif",Font.BOLD+Font.ITALIC,12);可以使用Graphics類(lèi)的setFont方法設(shè)置當(dāng)前繪圖區(qū)中的字體;可以使用Graphics類(lèi)的getFont方法取得當(dāng)前的字體。限于篇幅,以上對(duì)Graphics、Color和Font類(lèi)只進(jìn)行了簡(jiǎn)單的介紹,在使用過(guò)程中,讀者一定要多查看JDK幫助文檔。查看JDK幫助文檔的主要目的是便于了解類(lèi)中定義了哪些屬性和方法,如何構(gòu)造該類(lèi)的一個(gè)實(shí)例。當(dāng)讀者有了一定的基礎(chǔ)知識(shí)后再進(jìn)行Java程序設(shè)計(jì)時(shí),主要應(yīng)依靠JDK幫助文檔。8.2.2【案例8-1】畫(huà)一個(gè)“雪人”

1.案例描述設(shè)計(jì)一個(gè)Applet程序,畫(huà)一個(gè)卡通“雪人”。

2.案例效果案例8-1的執(zhí)行效果如圖8-6所示。圖8-6案例8-1的執(zhí)行效果

3.技術(shù)分析要在Applet程序中進(jìn)行繪圖,則有關(guān)繪圖的方法只能在paint方法中調(diào)用。在調(diào)用paint方法時(shí),以當(dāng)前Applet在瀏覽器中的窗口為繪圖對(duì)象,可以使用該繪圖對(duì)象的各種方法畫(huà)出如圖8-6所示的卡通人物。畫(huà)面顏色的設(shè)計(jì)要使用Color類(lèi),設(shè)置繪圖對(duì)象的顏色時(shí)可以使用setColor方法。

Applet中字體的顯示要使用Font類(lèi),設(shè)置字體時(shí)可以使用setFont方法。

4.程序解析下面是案例8-1的程序代碼:01//******************************************02//案例:8-103//程序名:Snowman.java04//功能:畫(huà)雪人05//******************************************0607importjava.applet.*;08importjava.awt.*;09publicclassSnowmanextendsApplet{10 11 publicvoidpaint(Graphicsg){12 finalintMID=150;13 finalintTOP=50;14 FontmyFont=newFont("華文彩云",Font.BOLD+Font.ITALIC,18);15 16 //設(shè)置Applet窗口的背景色17 setBackground(Color.CYAN);18 19 g.setFont(myFont);20 g.drawString("這是我堆的雪人!",80,20);2122 //用藍(lán)色畫(huà)表示地面的矩形23 g.setColor(Color.BLUE);24 g.fillRect(0,175,300,100);25 26 //用紅色畫(huà)表示太陽(yáng)的圓27 g.setColor(Color.RED);28 g.fillOval(-40,-40,80,90);29 30 //畫(huà)身軀31 g.setColor(Color.WHITE);32 g.fillOval(MID-20,TOP,40,40);//頭部33 g.fillOval(MID-35,TOP+35,70,50);//身軀中部34 g.fillOval(MID-50,TOP+80,100,60);//身軀下部35 36 //畫(huà)眼睛37 g.setColor(Color.BLUE);38 g.fillOval(MID-10,TOP+10,5,5);//左眼39 g.fillOval(MID+5,TOP+10,5,5);//右眼40 41 g.setColor(Color.BLACK);42 g.drawArc(MID-10,TOP+20,20,10,190,160);//嘴43 g.drawLine(MID-25,TOP+60,MID-50,TOP+40);

//左臂44 g.drawLine(MID+25,TOP+60,MID+55,TOP+40);

//右臂45 46 //帽子47 g.drawLine(MID-20,TOP+5,MID+20,TOP+5);48 g.fillRect(MID-15,TOP-20,30,25);49 }50}8.2.3【相關(guān)知識(shí)】使用Graphics2D類(lèi)繪圖在Java1.2API中還提供了功能更強(qiáng)大的二維圖形處理能力。與二維圖形有關(guān)的類(lèi)分布在Java的不同包中,大部分位于java.awt.geom包中。這些類(lèi)可以完成任意寬度直線(xiàn)的繪制,還具有用漸變顏色和紋理來(lái)填充圖形的功能等。在前面介紹的實(shí)例中,繪圖時(shí)paint方法要傳入一個(gè)Graphics類(lèi)型的參數(shù)g,然后在paint方法中通過(guò)調(diào)用g的各種方法來(lái)繪制圖形,因此,Graphics類(lèi)型的對(duì)象g就成了一個(gè)“畫(huà)筆”。同樣,為了處理二維圖形,在Java1.2API中定義了一個(gè)新的Graphics2D類(lèi),Graphics2D類(lèi)繼承了Graphics類(lèi)。如果把Graphics2D類(lèi)的對(duì)象作為一個(gè)“畫(huà)筆”來(lái)繪畫(huà),則要有一個(gè)該類(lèi)的對(duì)象。一般在paint方法中通過(guò)如下的強(qiáng)制類(lèi)型轉(zhuǎn)換來(lái)取得一個(gè)Graphics2D類(lèi)的對(duì)象:publicvoidpaint(Graphicsg){Graphics2Dg2d=(Graphics2D)g;…}在使用Graphics2D類(lèi)繪圖時(shí),把將要繪制的圖形作為一個(gè)對(duì)象來(lái)處理,因此,在繪制圖形之前先要?jiǎng)?chuàng)建一個(gè)所要繪制圖形的對(duì)象,這與Graphics類(lèi)直接進(jìn)行繪圖是不同的。對(duì)于創(chuàng)建好的繪圖對(duì)象,可以使用Graphics2D類(lèi)的draw方法繪制在Applet窗口中,draw方法的參數(shù)為創(chuàng)建好的繪圖對(duì)象。常用的繪圖對(duì)象有:

1)直線(xiàn)對(duì)象要繪制一條直線(xiàn),就要?jiǎng)?chuàng)建一個(gè)java.awt.geom包中Line2D類(lèi)的對(duì)象。如果點(diǎn)的坐標(biāo)是以雙精度數(shù)指定的,則要用Line2D.Double類(lèi)創(chuàng)建該對(duì)象:Line2Dline=newLine2D.Double(12.2d,12.34d,100.3d,90.49d);表示創(chuàng)建一個(gè)從(12.2d,12.34d)點(diǎn)到(100.3d,90.49d)點(diǎn)的直線(xiàn)對(duì)象。

2)矩形對(duì)象要繪制一個(gè)矩形,就要?jiǎng)?chuàng)建一個(gè)java.awt.geom包中Rectangle2D類(lèi)的對(duì)象。如果點(diǎn)的坐標(biāo)是以雙精度數(shù)指定的,則要用Rectangle2D.Double類(lèi)創(chuàng)建該對(duì)象:Rectangle2Drect=newRectangle2D.Double(12.2d,12.34d,100.3d,90.49d);表示創(chuàng)建一個(gè)左上角坐標(biāo)為(12.2d,12.34d),寬為100.3d,高為90.49d的矩形對(duì)象。

3)橢圓對(duì)象創(chuàng)建一個(gè)橢圓對(duì)象時(shí),要使用java.awt.geom包中的Ellipse2D.Double類(lèi):Ellipse2Drect=newEllipse2D.Double(12.2d,12.34d,100.3d,90.49d);表示創(chuàng)建一個(gè)橢圓對(duì)象,橢圓對(duì)象包含在左上角坐標(biāo)為(12.2d,12.34d),寬為100.3d,高為90.49d的矩形中。

4)二次曲線(xiàn)對(duì)象如果要?jiǎng)?chuàng)建一個(gè)二次多項(xiàng)式y(tǒng)(x)=ax2+bx+c,就要使用java.awt.geom包中的QuadCurve2D.Double類(lèi):QuadCurve2Dcurve=newQuadCurve2D.Double(12,12,10,40,100,90);表示過(guò)(12,12)點(diǎn)和(100,90)點(diǎn)及控制點(diǎn)(10,40)創(chuàng)建一條二次曲線(xiàn)對(duì)象。

5)三次曲線(xiàn)對(duì)象如果要?jiǎng)?chuàng)建一個(gè)三次多項(xiàng)式y(tǒng)(x)=ax3+bx2+cx+d,就要使用java.awt.geom包中的CubicCurve2D.Double類(lèi):CubicCurve2Dcurve=newCubicCurve2D.Double(50,30,10,10,100,100,50,100);表示過(guò)(50,30)點(diǎn)和(50,100)點(diǎn)及控制點(diǎn)(10,10)和(100,100)創(chuàng)建一條三次曲線(xiàn)。下面是一個(gè)圖形類(lèi)的應(yīng)用實(shí)例:01importjava.awt.*;02importjava.applet.*;03importjava.awt.geom.*;0405publicclassTest2DextendsApplet{06 publicvoidpaint(Graphicsg){Graphics2Dg2d=(Graphics2D)g;08 Line2Dline=newLine2D.Double(10,10,100,100);09 QuadCurve2Dcurve=newQuadCurve2D.Double(10,10,100,100,200,10);10 CubicCurve2Dcubic=newCubicCurve2D.Double(10,150,80,80,160,210,200,150);11 g2d.draw(line);12 line.setLine(100,100,200,10);13 g2d.draw(line);14 g2d.drawString("控制點(diǎn)(100,100)",65,115);15 g2d.draw(curve);16 g2d.draw(cubic);17 }18}該程序的運(yùn)行結(jié)果如圖8-7所示。圖8-72D圖形繪制實(shí)例技能拓展8.3Applet多媒體程序的設(shè)計(jì)在Applet程序中還可以顯示圖像與播放音樂(lè)。本節(jié)將舉例說(shuō)明設(shè)計(jì)Applet多媒體程序的方法。8.3.1在Applet程序中顯示圖像在Applet多媒體程序中,為了確定一個(gè)資源所在的位置(如一個(gè)圖片的位置等),要使用URL(即統(tǒng)一資源定位符,可在網(wǎng)絡(luò)中唯一標(biāo)識(shí)一個(gè)資源的地址)。Java提供的.URL類(lèi)描述了Internet中使用的URL。在Applet類(lèi)中有兩個(gè)方法可以返回URL的值:●?getDocumentBase():返回一個(gè)描述當(dāng)前瀏覽器中帶有Applet標(biāo)記的HTML文件所屬頁(yè)面目錄的URL對(duì)象?!?getCodeBase():返回一個(gè)描述Applet類(lèi)文件本身源目錄的URL對(duì)象。它通常與HTML文件目錄相同。得到一個(gè)URL對(duì)象后,可以將該URL位置處的資源通過(guò)Applet程序載入網(wǎng)頁(yè),這樣就可以在一個(gè)網(wǎng)頁(yè)中顯示圖像和播放音樂(lè)了。在Applet程序中顯示一個(gè)圖像文件的主要過(guò)程是:

(1)用Applet類(lèi)的getCodeBase()方法獲得圖像的地址(URL)。

(2)用Applet類(lèi)的getImage()方法取得可以在屏幕上繪制的圖像(Image)對(duì)象。

(3)在paint()方法中用Graphics類(lèi)的drawImage()方法顯示圖像。下面是一個(gè)將當(dāng)前程序所在位置的bird.jpg圖像顯示出來(lái)的Applet程序:01//實(shí)例8-3:在Applet程序中顯示圖片(ImageDemo.java)02importjava.applet.*;03publicclassImageDemoextendsApplet{04Imageimg;05publicvoidinit(){06img=getImage(getCodeBase(),"bird.jpg");07}08publicvoidpaint(Graphicsg){09g.drawImage(img,20,20,this);10}11}程序的04行聲明了一個(gè)圖像類(lèi)的變量img,用于存放將要顯示的圖像。06行在init方法中對(duì)img進(jìn)行了初始化,即載入圖像。09行表示圖像在窗口的左上角位置是(20,20)。8.3.2在Applet程序中播放音樂(lè)在Applet程序中播放一個(gè)聲音文件的主要過(guò)程是:

(1)用Applet類(lèi)的getAudioClip(URLbase,Stringtarget)方法裝入一段要播放的音樂(lè)。該方法的返回值是java.applet.AudioClip類(lèi)型的一個(gè)實(shí)例,AudioClip類(lèi)型是一個(gè)專(zhuān)門(mén)用于聲音播放的接口。例如:AudioClipsound=getAudioClip(getDocumentBase(),"bark.au");

(2)使用AudioClip接口中的play方法可以將已裝入的音樂(lè)播放一遍。例如:sound.play();

(3)使用AudioClip中的loop方法重復(fù)播放。例如:sound.loop();

(4)要停止一段正在播放的音樂(lè),可用AudioClip中的stop方法。例如:sound.stop();下面是一個(gè)循環(huán)播放音樂(lè)的Applet程序?qū)嵗?1//實(shí)例8-4:在Applet中播放音樂(lè)(AudioTest.java)02importjava.awt.Graphics;03importjava.applet.*;04publicclassAudioTestextendsApplet{05AudioClipsound;06publicvoidinit(){07sound=getAudioClip(getDocumentBase(),"2.au");08}09publicvoidpaint(Graphicsg){10g.drawString("AudioTest",25,25);11}12publicvoidstart(){13sound.loop();14}15publicvoidstop(){16sound.stop();17}18}8.3.3【相關(guān)知識(shí)】向Applet程序傳遞參數(shù)如同JavaApplication可以使用命令行來(lái)接收用戶(hù)參數(shù)一樣,它也可以向Applet傳遞參數(shù)。不過(guò)在Applet中,這個(gè)任務(wù)要通過(guò)HTML文件來(lái)完成。本節(jié)舉例說(shuō)明從HTML文件向Applet程序傳遞參數(shù)的方法。向Applet程序傳遞參數(shù)時(shí),首先要在HTML文件中使用PARAM標(biāo)記的name屬性設(shè)置參數(shù)的名稱(chēng)(即變量名),并使用value屬性設(shè)置參數(shù)的值。然

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論