版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第7章章 圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)7.1 圖形用戶界面概述圖形用戶界面概述7.2 用戶自定義成分用戶自定義成分7.3 Java的事件處理的事件處理7.4 GUI標(biāo)準(zhǔn)組件概述標(biāo)準(zhǔn)組件概述7.5 標(biāo)簽、按鈕與動(dòng)作事件標(biāo)簽、按鈕與動(dòng)作事件7.6 文本框、文本區(qū)域與文本事件文本框、文本區(qū)域與文本事件7.7 單、復(fù)選按鈕,列表與選擇事件單、復(fù)選按鈕,列表與選擇事件7.8 滾動(dòng)條與調(diào)整事件滾動(dòng)條與調(diào)整事件7.9 畫布與鼠標(biāo)、鍵盤事件畫布與鼠標(biāo)、鍵盤事件7.10 布局設(shè)計(jì)布局設(shè)計(jì)7.11 Panel與容器事件與容器事件7.12 Frame與窗口事件與窗口事件7.13 菜單的定義與使
2、用菜單的定義與使用7.14 對(duì)話框、組件事件與焦點(diǎn)事件對(duì)話框、組件事件與焦點(diǎn)事件7.15 小結(jié)小結(jié)習(xí)題習(xí)題本章介紹本章介紹Java程序中圖形用戶界面程序中圖形用戶界面(GUI)的設(shè)計(jì)與實(shí)的設(shè)計(jì)與實(shí)現(xiàn)。圖形用戶界面是程序與用戶交互的窗口。每個(gè)現(xiàn)。圖形用戶界面是程序與用戶交互的窗口。每個(gè)圖形界面下的圖形界面下的Java程序都必須設(shè)計(jì)、建立自己的圖程序都必須設(shè)計(jì)、建立自己的圖形用戶界面并利用它接受用戶的輸入,向用戶輸出形用戶界面并利用它接受用戶的輸入,向用戶輸出程序運(yùn)行的結(jié)果。本章將介紹圖形用戶界面的基本程序運(yùn)行的結(jié)果。本章將介紹圖形用戶界面的基本組成和主要操作,包括繪制圖形,顯示動(dòng)畫,使用組成和主
3、要操作,包括繪制圖形,顯示動(dòng)畫,使用AWT包各組件和實(shí)現(xiàn)包各組件和實(shí)現(xiàn)Java的事件處理功能等。的事件處理功能等。7.1 圖形用戶界面概述圖形用戶界面概述設(shè)計(jì)和構(gòu)造用戶界面,是軟件開發(fā)中的一項(xiàng)重要工設(shè)計(jì)和構(gòu)造用戶界面,是軟件開發(fā)中的一項(xiàng)重要工作。用戶界面是計(jì)算機(jī)的使用者作。用戶界面是計(jì)算機(jī)的使用者用戶與計(jì)算機(jī)用戶與計(jì)算機(jī)系統(tǒng)交互的接口,用戶界面功能是否完善,使用是系統(tǒng)交互的接口,用戶界面功能是否完善,使用是否方便,將直接影響到用戶對(duì)應(yīng)用軟件的使用。圖否方便,將直接影響到用戶對(duì)應(yīng)用軟件的使用。圖形用戶界面形用戶界面(graphics user interface)簡(jiǎn)稱簡(jiǎn)稱GUI,使,使用圖形的方
4、式借助菜單、按鈕等標(biāo)準(zhǔn)界面元素和鼠用圖形的方式借助菜單、按鈕等標(biāo)準(zhǔn)界面元素和鼠標(biāo)操作,幫助用戶方便地向計(jì)算機(jī)系統(tǒng)發(fā)出命令,標(biāo)操作,幫助用戶方便地向計(jì)算機(jī)系統(tǒng)發(fā)出命令,啟動(dòng)操作,并將系統(tǒng)運(yùn)行的結(jié)果同樣以圖形的方式啟動(dòng)操作,并將系統(tǒng)運(yùn)行的結(jié)果同樣以圖形的方式顯示給用戶。圖形用戶界面操作簡(jiǎn)便,省去了字符顯示給用戶。圖形用戶界面操作簡(jiǎn)便,省去了字符界面用戶必須記憶各種命令的麻煩,已經(jīng)成為目前界面用戶必須記憶各種命令的麻煩,已經(jīng)成為目前幾乎所有應(yīng)用軟件的既成標(biāo)準(zhǔn)。所以,學(xué)習(xí)設(shè)計(jì)和幾乎所有應(yīng)用軟件的既成標(biāo)準(zhǔn)。所以,學(xué)習(xí)設(shè)計(jì)和開發(fā)圖形用戶界面,是軟件開發(fā)人員必修的一課。開發(fā)圖形用戶界面,是軟件開發(fā)人員必修的
5、一課。隨著圖形用戶界面的普及和界面元素標(biāo)準(zhǔn)化程度的隨著圖形用戶界面的普及和界面元素標(biāo)準(zhǔn)化程度的提高,許多輔助設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面的方法和提高,許多輔助設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面的方法和工具也相應(yīng)出現(xiàn),例如,可視化編程方法允許設(shè)計(jì)工具也相應(yīng)出現(xiàn),例如,可視化編程方法允許設(shè)計(jì)人員直接繪出圖形界面,然后交給專門的工具自動(dòng)人員直接繪出圖形界面,然后交給專門的工具自動(dòng)編碼生成這個(gè)圖形界面,免除了開發(fā)者的許多編程編碼生成這個(gè)圖形界面,免除了開發(fā)者的許多編程負(fù)擔(dān),目前許多應(yīng)用軟件開發(fā)工具都具有可視化編負(fù)擔(dān),目前許多應(yīng)用軟件開發(fā)工具都具有可視化編程的功能。程的功能。Java語(yǔ)言中,為了方便圖形用戶界面的開發(fā),設(shè)
6、計(jì)語(yǔ)言中,為了方便圖形用戶界面的開發(fā),設(shè)計(jì)了專門的類庫(kù)來生成各種標(biāo)準(zhǔn)圖形界面元素和處理了專門的類庫(kù)來生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面的各種事件。這個(gè)用來生成圖形用戶界面圖形界面的各種事件。這個(gè)用來生成圖形用戶界面的類庫(kù)就是的類庫(kù)就是java.awt包。包。AWT是是abstract window toolkit(抽象窗口工具集抽象窗口工具集)的縮寫。的縮寫。 所謂抽象,是因?yàn)樗^抽象,是因?yàn)镴ava是一種跨平臺(tái)的語(yǔ)言,要求是一種跨平臺(tái)的語(yǔ)言,要求Java程序能在不同的平臺(tái)系統(tǒng)上運(yùn)行,這對(duì)于圖形程序能在不同的平臺(tái)系統(tǒng)上運(yùn)行,這對(duì)于圖形用戶界面尤其困難。為了達(dá)到這個(gè)目標(biāo),用戶界面尤其困難。為
7、了達(dá)到這個(gè)目標(biāo),AWT類類庫(kù)中的各種操作被定義成在一個(gè)并不存在的庫(kù)中的各種操作被定義成在一個(gè)并不存在的“抽象抽象窗口窗口”中進(jìn)行。正如中進(jìn)行。正如Java虛擬機(jī)使得虛擬機(jī)使得Java程序獨(dú)立程序獨(dú)立于具體的軟硬件平臺(tái)一樣,于具體的軟硬件平臺(tái)一樣,“抽象窗口抽象窗口”使得開發(fā)使得開發(fā)人員所設(shè)計(jì)的界面獨(dú)立于具體的界面實(shí)現(xiàn)。也就是人員所設(shè)計(jì)的界面獨(dú)立于具體的界面實(shí)現(xiàn)。也就是說,開發(fā)人員用說,開發(fā)人員用AWT開發(fā)出的圖形用戶界面可以開發(fā)出的圖形用戶界面可以適用于所有的平臺(tái)系統(tǒng)。當(dāng)然,這僅是理想情況。適用于所有的平臺(tái)系統(tǒng)。當(dāng)然,這僅是理想情況。實(shí)際上實(shí)際上AWT的功能還不是很完全的功能還不是很完全,Ja
8、va程序的圖程序的圖形用戶界面在不同的平臺(tái)上形用戶界面在不同的平臺(tái)上(例如,在不同的瀏覽例如,在不同的瀏覽器中器中)可能會(huì)出現(xiàn)不同的運(yùn)行效果,如窗口大小、可能會(huì)出現(xiàn)不同的運(yùn)行效果,如窗口大小、字體效果將發(fā)生變化等。字體效果將發(fā)生變化等。首先考察一下圖形用戶界面的構(gòu)成。首先考察一下圖形用戶界面的構(gòu)成。簡(jiǎn)單地說,圖形用戶界面就是一組圖形界面成分和簡(jiǎn)單地說,圖形用戶界面就是一組圖形界面成分和界面元素的有機(jī)組合,這些成分和元素之間不但外界面元素的有機(jī)組合,這些成分和元素之間不但外觀上有著包含、相鄰、相交等物理關(guān)系,內(nèi)在的也觀上有著包含、相鄰、相交等物理關(guān)系,內(nèi)在的也有包含、調(diào)用等邏輯關(guān)系,它們互相作用
9、、傳遞消有包含、調(diào)用等邏輯關(guān)系,它們互相作用、傳遞消息,共同組成一個(gè)能響應(yīng)特定事件、具有一定功能息,共同組成一個(gè)能響應(yīng)特定事件、具有一定功能的圖形界面系統(tǒng)。的圖形界面系統(tǒng)。設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面的工作主要有兩個(gè):設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面的工作主要有兩個(gè): 創(chuàng)建組成界面的各成分和元素,指定它們的屬性創(chuàng)建組成界面的各成分和元素,指定它們的屬性和位置關(guān)系,根據(jù)具體需要排列它們,從而構(gòu)成完和位置關(guān)系,根據(jù)具體需要排列它們,從而構(gòu)成完整的圖形用戶界面的物理外觀。整的圖形用戶界面的物理外觀。 定義圖形用戶界面的事件和各界面元素對(duì)不同事定義圖形用戶界面的事件和各界面元素對(duì)不同事件的響應(yīng),從而實(shí)現(xiàn)圖形用戶界面與
10、用戶的交互功件的響應(yīng),從而實(shí)現(xiàn)圖形用戶界面與用戶的交互功能。能。Java中構(gòu)成圖形用戶界面的各種元素和成分可以粗中構(gòu)成圖形用戶界面的各種元素和成分可以粗略地被分為三類:容器、控制組件和用戶自定義成略地被分為三類:容器、控制組件和用戶自定義成分。分。1. 容器容器容器是用來組織其他界面成分和元素的單元。一般容器是用來組織其他界面成分和元素的單元。一般說來一個(gè)應(yīng)用程序的圖形用戶界面首先對(duì)應(yīng)于一個(gè)說來一個(gè)應(yīng)用程序的圖形用戶界面首先對(duì)應(yīng)于一個(gè)復(fù)雜的容器,如一個(gè)窗口。這個(gè)容器內(nèi)部將包含許復(fù)雜的容器,如一個(gè)窗口。這個(gè)容器內(nèi)部將包含許多界面成分和元素,這些界面元素本身也可能又是多界面成分和元素,這些界面元素
11、本身也可能又是一個(gè)容器,這個(gè)容器再進(jìn)一步包含它的界面成分和一個(gè)容器,這個(gè)容器再進(jìn)一步包含它的界面成分和元素,依此類推就構(gòu)成一個(gè)復(fù)雜的圖形界面系統(tǒng)。元素,依此類推就構(gòu)成一個(gè)復(fù)雜的圖形界面系統(tǒng)。容器的引入有利于分解圖形用戶界面的復(fù)雜性,當(dāng)容器的引入有利于分解圖形用戶界面的復(fù)雜性,當(dāng)界面的功能較多時(shí),使用層層相套的容器是非常有界面的功能較多時(shí),使用層層相套的容器是非常有必要的。必要的。2. 控制組件控制組件與容器不同,控制組件是圖形用戶界面的最小單位與容器不同,控制組件是圖形用戶界面的最小單位之一,它里面不再包含其他的成分??刂平M件的作之一,它里面不再包含其他的成分??刂平M件的作用是完成與用戶的一次
12、交互,包括接收用戶的一個(gè)用是完成與用戶的一次交互,包括接收用戶的一個(gè)命令命令(如菜單命令如菜單命令),接收用戶的一個(gè)文本或選擇輸,接收用戶的一個(gè)文本或選擇輸入,向用戶顯示一段文本或一個(gè)圖形,等等。從某入,向用戶顯示一段文本或一個(gè)圖形,等等。從某種程度上來說,控制組件是圖形用戶界面標(biāo)準(zhǔn)化的種程度上來說,控制組件是圖形用戶界面標(biāo)準(zhǔn)化的結(jié)果,目前常用的控制組件有選擇類的單選按鈕、結(jié)果,目前常用的控制組件有選擇類的單選按鈕、復(fù)選按鈕、下拉列表;有文字處理類的文本框、文復(fù)選按鈕、下拉列表;有文字處理類的文本框、文本區(qū)域;有命令類的按鈕、菜單等。其中文本框、本區(qū)域;有命令類的按鈕、菜單等。其中文本框、按鈕
13、和標(biāo)簽是前面使用過的按鈕和標(biāo)簽是前面使用過的GUI組件。組件。使用控制組件,通常需要如下的步驟:使用控制組件,通常需要如下的步驟:(1) 創(chuàng)建某控制組件類的對(duì)象,指定其大小等屬性。創(chuàng)建某控制組件類的對(duì)象,指定其大小等屬性。(2) 使用某種布局策略,將該控制組件對(duì)象加入到某使用某種布局策略,將該控制組件對(duì)象加入到某個(gè)容器中的某指定位置處。個(gè)容器中的某指定位置處。(3) 將該組件對(duì)象注冊(cè)給它所能產(chǎn)生的事件對(duì)應(yīng)的事將該組件對(duì)象注冊(cè)給它所能產(chǎn)生的事件對(duì)應(yīng)的事件監(jiān)聽者,重載事件處理方法,實(shí)現(xiàn)利用該組件對(duì)件監(jiān)聽者,重載事件處理方法,實(shí)現(xiàn)利用該組件對(duì)象與用戶交互的功能。象與用戶交互的功能。嚴(yán)格說來,容器也是
14、一種控制組件,因?yàn)橐粋€(gè)容器嚴(yán)格說來,容器也是一種控制組件,因?yàn)橐粋€(gè)容器也可以被視為組件而包含在其他容器的內(nèi)部。也可以被視為組件而包含在其他容器的內(nèi)部。3. 用戶自定義成分用戶自定義成分除了上述的標(biāo)準(zhǔn)圖形界面元素,編程人員還可以根除了上述的標(biāo)準(zhǔn)圖形界面元素,編程人員還可以根據(jù)用戶的需要設(shè)計(jì)一些用戶自定義的圖形界面成分,據(jù)用戶的需要設(shè)計(jì)一些用戶自定義的圖形界面成分,例如繪制一些幾何圖形、使用標(biāo)志圖案等。用戶自例如繪制一些幾何圖形、使用標(biāo)志圖案等。用戶自定義成分由于不能像標(biāo)準(zhǔn)界面元素一樣被系統(tǒng)識(shí)別定義成分由于不能像標(biāo)準(zhǔn)界面元素一樣被系統(tǒng)識(shí)別和承認(rèn),所以通常只能起到裝飾、美化的作用,而和承認(rèn),所以通常
15、只能起到裝飾、美化的作用,而不能響應(yīng)用戶的動(dòng)作,也不具有交互功能。不能響應(yīng)用戶的動(dòng)作,也不具有交互功能。7.2 用戶自定義成分用戶自定義成分本節(jié)主要介紹如何利用本節(jié)主要介紹如何利用Java類庫(kù)中的類及其方法來類庫(kù)中的類及其方法來繪制用戶自定義的圖形界面成分。編程人員可以利繪制用戶自定義的圖形界面成分。編程人員可以利用這些方法自由地繪制圖形和文字,也可以將已經(jīng)用這些方法自由地繪制圖形和文字,也可以將已經(jīng)存在的圖形、動(dòng)畫等加載到當(dāng)前程序中來。繪制圖存在的圖形、動(dòng)畫等加載到當(dāng)前程序中來。繪制圖形和文字將要用到前面已經(jīng)接觸過的類形和文字將要用到前面已經(jīng)接觸過的類Graphics。Graphics是是j
16、ava.awt包中一個(gè)類,其中包括了很多繪包中一個(gè)類,其中包括了很多繪制圖形和文字的方法。當(dāng)一個(gè)制圖形和文字的方法。當(dāng)一個(gè)Applet運(yùn)行時(shí),執(zhí)行運(yùn)行時(shí),執(zhí)行它的瀏覽器會(huì)自動(dòng)為它創(chuàng)建一個(gè)它的瀏覽器會(huì)自動(dòng)為它創(chuàng)建一個(gè)Graphics類的實(shí)例,類的實(shí)例,利用這個(gè)實(shí)例,就可以在利用這個(gè)實(shí)例,就可以在Applet中隨意繪制圖形和中隨意繪制圖形和文字。實(shí)際上文字。實(shí)際上Applet本身就是一個(gè)圖形界面的容器。本身就是一個(gè)圖形界面的容器。而如果希望在圖形界面的而如果希望在圖形界面的Java Application程序中程序中繪制圖形,則需要?jiǎng)?chuàng)建一個(gè)繪制圖形,則需要?jiǎng)?chuàng)建一個(gè)Canvas類的對(duì)象加入類的對(duì)象加
17、入到這個(gè)到這個(gè)Application程序的圖形界面容器中,程序的圖形界面容器中,Canvas對(duì)象也擁有一個(gè)與對(duì)象也擁有一個(gè)與Applet類的類的paint( )方法相同的方法相同的paint( )方法,利用系統(tǒng)傳遞給這個(gè)方法,利用系統(tǒng)傳遞給這個(gè)paint( )方法的方法的Graphics類參數(shù)對(duì)象就可以在類參數(shù)對(duì)象就可以在Application程序的圖程序的圖形用戶界面中繪制各種圖形和文字。形用戶界面中繪制各種圖形和文字。7.2.1 繪制圖形繪制圖形利用利用Graphics類可繪制的圖形有直線、各種矩形、多類可繪制的圖形有直線、各種矩形、多邊形、圓和橢圓等。下面的例子綜合了這些方法。邊形、圓和
18、橢圓等。下面的例子綜合了這些方法。例例 7-1 DrawFigures.java 1: import java.awt.*;2: import java.applet.Applet;3: public class DrawFigures extends Applet4: 5: public void paint ( Graphics g)6: 7: g.drawLine(30,5,40,5); /畫直線畫直線8: g.drawRect(40,10,50,20);/畫矩形框畫矩形框(左上角左上角x坐標(biāo),坐標(biāo), 左上角左上角y坐標(biāo),坐標(biāo),x軸尺寸,軸尺寸,y軸尺寸軸尺寸)9: g.fillRect
19、(60,30,70,40); /畫實(shí)心矩形畫實(shí)心矩形10: g.drawRoundRect(110,10,130,50,30,30); /畫圓角矩畫圓角矩形框形框11: g.drawOval(150,120,70,40); /畫橢圓形框畫橢圓形框(左上角左上角x坐標(biāo),左上角坐標(biāo),左上角y坐標(biāo),坐標(biāo),x軸尺寸,軸尺寸,y軸尺寸軸尺寸),若,若x軸尺寸與軸尺寸與y軸尺寸相等,則畫出圓形軸尺寸相等,則畫出圓形12: g.fillOval(190,160,70,40); /畫實(shí)心橢圓畫實(shí)心橢圓13: g.drawOval(90,100,50,40); /畫橢圓框畫橢圓框14: g.fillOval(1
20、30,100,50,40); /畫實(shí)心橢圓畫實(shí)心橢圓15: drawMyPolygon(g); /自定義的畫多邊形的方法自定義的畫多邊形的方法16: g.drawString(They are figures!,100,220); 17: 18: public void drawMyPolygon( Graphics g)19: 20: int xCoords = 30,50,65,119,127; /保存多邊形各點(diǎn)保存多邊形各點(diǎn)x坐標(biāo)的數(shù)組坐標(biāo)的數(shù)組21: int yCoords = 100, 140,127,169,201; /保存多邊形各點(diǎn)保存多邊形各點(diǎn)y坐標(biāo)的數(shù)組坐標(biāo)的數(shù)組22: g.
21、drawPolygon( xCoords,yCoords,5); /畫自由多邊形框畫自由多邊形框23: 24: 圖圖7.1是例是例7-1的運(yùn)行結(jié)果。從例的運(yùn)行結(jié)果。從例7-1可以看出,要在可以看出,要在Java程序圖形界面的容器中繪制圖形,首先,需要程序圖形界面的容器中繪制圖形,首先,需要明確希望繪制的圖形是什么,是圓、橢圓,還是直明確希望繪制的圖形是什么,是圓、橢圓,還是直線,這由所選定的方法來確定;其次,需要指明所線,這由所選定的方法來確定;其次,需要指明所繪制圖形或文字的大小和位置,這要通過相對(duì)于界繪制圖形或文字的大小和位置,這要通過相對(duì)于界面容器的二維像素坐標(biāo)來決定。面容器的二維像素坐
22、標(biāo)來決定。Java的屏幕坐標(biāo)是的屏幕坐標(biāo)是以像素為單位,容器的左上角被確定為橫坐標(biāo)以像素為單位,容器的左上角被確定為橫坐標(biāo)(x軸軸)和縱坐標(biāo)和縱坐標(biāo)(y軸軸)的起點(diǎn),向右和向下延伸坐標(biāo)值遞的起點(diǎn),向右和向下延伸坐標(biāo)值遞增。增。 圖圖 7.1 例例7-1的運(yùn)行結(jié)果的運(yùn)行結(jié)果繪制圖形的方法很多,每種方法一般也有多種靈活繪制圖形的方法很多,每種方法一般也有多種靈活的使用方式,這里不再贅述,讀者可以查閱程序員的使用方式,這里不再贅述,讀者可以查閱程序員手冊(cè)中的詳細(xì)規(guī)定。手冊(cè)中的詳細(xì)規(guī)定。除了除了Graphics類,類,Java中還定義了其他一些用來表示中還定義了其他一些用來表示幾何圖形的類,對(duì)繪制用戶
23、自定義成分也很有幫助。幾何圖形的類,對(duì)繪制用戶自定義成分也很有幫助。例如,利用例如,利用Point表示一個(gè)像素點(diǎn);利用表示一個(gè)像素點(diǎn);利用Dimension類表示寬和高;利用類表示寬和高;利用Rectangle類表示一個(gè)矩形;類表示一個(gè)矩形;利用利用Polygon類表示一個(gè)多邊形;利用類表示一個(gè)多邊形;利用Color類表示類表示顏色等,后面的例子中將利用這些系統(tǒng)定義的類繪顏色等,后面的例子中將利用這些系統(tǒng)定義的類繪圖。圖。7.2.2 顯示文字顯示文字從前面的例子中可以知道,從前面的例子中可以知道,Graphics類的方法類的方法drawString( )可以在屏幕的指定位置顯示一個(gè)字符可以在屏
24、幕的指定位置顯示一個(gè)字符串。串。Java中還有一個(gè)類中還有一個(gè)類Font,使用它可以獲得更加,使用它可以獲得更加豐富多彩和逼真精確的字體顯示效果。豐富多彩和逼真精確的字體顯示效果。一個(gè)一個(gè)Font類的對(duì)象表示了一種字體顯示效果,包括類的對(duì)象表示了一種字體顯示效果,包括字體類型、字型和字號(hào)。下面的語(yǔ)句用于創(chuàng)建一個(gè)字體類型、字型和字號(hào)。下面的語(yǔ)句用于創(chuàng)建一個(gè)Font類的對(duì)象:類的對(duì)象: Font MyFont = new Font ( TimesRoman, Font.BOLD, 12 ); MyFont對(duì)應(yīng)的是對(duì)應(yīng)的是12磅磅TimesRoman類型的黑體字,類型的黑體字,其中指定字型時(shí)需要用到
25、其中指定字型時(shí)需要用到Font類的三個(gè)常量:類的三個(gè)常量:Font.PLAIN, Font.BOLD, Font.ITALIC。如果希望使用該如果希望使用該Font對(duì)象,則可以利用對(duì)象,則可以利用Graphics類的類的setFont( )方法:方法: g. setFont ( MyFont );如果希望指定控制組件,如按鈕或文本框中的字體如果希望指定控制組件,如按鈕或文本框中的字體效果,則可以使用控制組件的方法效果,則可以使用控制組件的方法setFont( )。如設(shè)。如設(shè)btn是一個(gè)按鈕對(duì)象,則語(yǔ)句:是一個(gè)按鈕對(duì)象,則語(yǔ)句: btn.setFont(MyFont);將把這個(gè)按鈕上顯示的標(biāo)簽的
26、字體改為將把這個(gè)按鈕上顯示的標(biāo)簽的字體改為12磅的磅的TimesRoman黑體字。黑體字。另外,與另外,與setFont( )方法相對(duì)的方法相對(duì)的getFont( )方法將返回方法將返回當(dāng)前當(dāng)前Graphics或組件對(duì)象使用的字體?;蚪M件對(duì)象使用的字體。例例 7-2 AvailableFonts.java1: import java.applet.*;2: import java.awt.*;3:4: public class AvailableFont extends Applet5: 6: GraphicsEnvironment gl = GraphicsEnvironment.getLo
27、calGraphicsEnvironment( );7: String FontNames = gl.getAvailableFontFamilyNames( );8:9: public void paint(Graphics g)10: 11: Font current,oldFont;12: 13: oldFont = g.getFont( );14: for(int i=0;iFontNames.length;i+)15: 16: current = new Font(FontNamesi,Font.PLAIN,10);17: g.setFont(current);18: g.drawS
28、tring(current.getName( ),10+i%4*120,20+i/4*15);19: 20: g.setFont(oldFont);21: 22: 在例在例7-2中,首先在第中,首先在第6句利用句利用java.awt包的包的G r a p h i c s E n v i r o n m e n t 類 的 靜 態(tài) 方 法類 的 靜 態(tài) 方 法getLocalGraphicsEnvironment( )獲得代表獲得代表Java程序程序運(yùn)行的當(dāng)前平臺(tái)的圖形環(huán)境的對(duì)象運(yùn)行的當(dāng)前平臺(tái)的圖形環(huán)境的對(duì)象gl,然后在第,然后在第7句調(diào)用句調(diào)用gl對(duì)象的對(duì)象的getAvailableFontF
29、amilyNames( )獲獲得當(dāng)前平臺(tái)上所有可以使用的字體名字,返回給字得當(dāng)前平臺(tái)上所有可以使用的字體名字,返回給字符串?dāng)?shù)組符串?dāng)?shù)組FontNames,該數(shù)組的每個(gè)元素是一,該數(shù)組的每個(gè)元素是一代表字體名的字符串。第代表字體名的字符串。第13句首先獲取并保存當(dāng)前句首先獲取并保存當(dāng)前缺省的字體對(duì)象。第缺省的字體對(duì)象。第14到到19句的循環(huán)修改當(dāng)前字體,句的循環(huán)修改當(dāng)前字體,設(shè)置成一可用的字體并輸出該字體的名稱,每四個(gè)設(shè)置成一可用的字體并輸出該字體的名稱,每四個(gè)字體占用一行;其中第字體占用一行;其中第16句使用句使用Font類的構(gòu)造函數(shù)類的構(gòu)造函數(shù)創(chuàng)建新字體對(duì)象。最后,第創(chuàng)建新字體對(duì)象。最后,第
30、20句把字體恢復(fù)成原來句把字體恢復(fù)成原來的缺省值。例的缺省值。例7-2的運(yùn)行結(jié)果如圖的運(yùn)行結(jié)果如圖7.2所示。所示。 圖圖 7.2 例例7-2的運(yùn)行結(jié)果的運(yùn)行結(jié)果 7.2.3 控制顏色控制顏色Applet中顯示的字符串或圖形的顏色可以用中顯示的字符串或圖形的顏色可以用Color類類的對(duì)象來控制,每個(gè)的對(duì)象來控制,每個(gè)Color對(duì)象代表一種顏色,用對(duì)象代表一種顏色,用戶可以直接使用戶可以直接使用Color類中定義好的顏色常量,也類中定義好的顏色常量,也可以通過調(diào)配紅、綠、藍(lán)三色的比例創(chuàng)建自己的可以通過調(diào)配紅、綠、藍(lán)三色的比例創(chuàng)建自己的Color對(duì)象。對(duì)象。Color類中定義有如下的三種構(gòu)造函數(shù):
31、類中定義有如下的三種構(gòu)造函數(shù):public Color(int Red, int Green, int Blue);public Color(float Red, float Green, float Blue);public Color(int RGB); 不論使用哪個(gè)構(gòu)造函數(shù)創(chuàng)建不論使用哪個(gè)構(gòu)造函數(shù)創(chuàng)建Color對(duì)象,都需要指定對(duì)象,都需要指定新建顏色中新建顏色中R(紅紅)、G(綠綠)、B(藍(lán)藍(lán))三色的比例。在三色的比例。在第一個(gè)構(gòu)造函數(shù)中通過三個(gè)整型參數(shù)指定第一個(gè)構(gòu)造函數(shù)中通過三個(gè)整型參數(shù)指定R,G,B,每個(gè)參數(shù)的取值范圍在,每個(gè)參數(shù)的取值范圍在0255之間;第二個(gè)構(gòu)之間;第二個(gè)構(gòu)造函數(shù)
32、通過三個(gè)浮點(diǎn)參數(shù)指定造函數(shù)通過三個(gè)浮點(diǎn)參數(shù)指定R,G,B,每個(gè)參,每個(gè)參數(shù)的取值范圍在數(shù)的取值范圍在0.01.0之間;第三個(gè)構(gòu)造函數(shù)通之間;第三個(gè)構(gòu)造函數(shù)通過一個(gè)整型參數(shù)指明其過一個(gè)整型參數(shù)指明其RGB三色比例,這個(gè)參數(shù)三色比例,這個(gè)參數(shù)的的07比特比特(取值范圍為取值范圍為0255)代表紅色的比例,代表紅色的比例,815比特代表綠色的比例,比特代表綠色的比例,1623比特代表藍(lán)色比特代表藍(lán)色的比例。例如下面的語(yǔ)句創(chuàng)建的是藍(lán)色:的比例。例如下面的語(yǔ)句創(chuàng)建的是藍(lán)色:Color blueColor = new Color(0,0,255); 調(diào)用調(diào)用Graphics對(duì)象的對(duì)象的setColor(
33、)方法可以把當(dāng)前的缺方法可以把當(dāng)前的缺省顏色修改成新建的顏色,使此后調(diào)用該省顏色修改成新建的顏色,使此后調(diào)用該Graphics對(duì)象完成的繪制工作,如繪制圖形、字符串等,都對(duì)象完成的繪制工作,如繪制圖形、字符串等,都使用這個(gè)新建顏色:使用這個(gè)新建顏色: g.setColor(blueColor);除了創(chuàng)建自己的顏色,也可以直接使用除了創(chuàng)建自己的顏色,也可以直接使用Color類中定類中定義好的顏色常量,如:義好的顏色常量,如: g.setColor(Color.cyan);Color類中共定義了類中共定義了13種靜態(tài)顏色常量,包括種靜態(tài)顏色常量,包括black,orange,pink,grey等,
34、使用時(shí)只需以等,使用時(shí)只需以Color為前為前綴,非常方便。綴,非常方便。 對(duì)于對(duì)于GUI的控制組件,它們有四個(gè)與顏色有關(guān)的方法的控制組件,它們有四個(gè)與顏色有關(guān)的方法分別用來設(shè)置和獲取組件的背景色和前景色:分別用來設(shè)置和獲取組件的背景色和前景色:public void setBackground(Color c)public Color getBackground( )public void setForeground( )public Color getForeground( ) 例例 7-3 UseColor.java1: import java.applet.Applet;2: impo
35、rt java.awt.*;3:4: public class UseColor extends Applet5: 6: Color oldColor; 7: String ParamName = red,green,blue; /三個(gè)三個(gè)HTML參數(shù)的名稱參數(shù)的名稱8: int RGBarray = new int3; /保存三色比例的數(shù)組保存三色比例的數(shù)組9:10: public void init( )11: 12: for(int i=0;iParamName.length;i+) /取得取得HTML文件指定的三色文件指定的三色13: RGBarrayi = Integer.parse
36、Int(getParameter(ParamNamei);14: 15: public void paint(Graphics g)16: 17: oldColor = g.getColor( ); /保存原有的缺省顏色保存原有的缺省顏色18: g.setColor(new Color(RGBarray0,RGBarray1,RGBarray2); /置新顏色置新顏色19: g.drawString(How do you think about Current color:20: + g.getColor( ).toString( ),10,20); /用新建顏用新建顏色顯示該顏色的三色分量色
37、顯示該顏色的三色分量21: g.setColor(oldColor); /恢復(fù)原有顏色恢復(fù)原有顏色22: g.drawString(Back to old default color:+ g.getColor( ).toString( ),10,40);23: 24: 例例7-3的運(yùn)行結(jié)果如圖的運(yùn)行結(jié)果如圖7.3所示。所示。例例7-3利用利用HTML文件傳遞給文件傳遞給Java Applet的三個(gè)參數(shù)的三個(gè)參數(shù)作為作為R,G,B三色的比例。第三色的比例。第18句用句用該該比例創(chuàng)建比例創(chuàng)建顏色,并用新顏色顯示字符串顏色,并用新顏色顯示字符串(包括新顏色中三色包括新顏色中三色的比例含量的比例含量)
38、。第。第21句再恢復(fù)原來的缺省顏色。句再恢復(fù)原來的缺省顏色。 圖圖 7.3 例例7-3的運(yùn)行結(jié)果的運(yùn)行結(jié)果 此程序?qū)?yīng)的此程序?qū)?yīng)的HTML文件如下:文件如下:UseColor 通過改變?nèi)齻€(gè)參數(shù)的數(shù)值通過改變?nèi)齻€(gè)參數(shù)的數(shù)值(應(yīng)在應(yīng)在0255之間之間),就可以,就可以指定不同的顏色而不需要重新編譯指定不同的顏色而不需要重新編譯Java Applet程序。程序。 7.2.4 顯示圖像顯示圖像由于圖像的數(shù)據(jù)量要遠(yuǎn)遠(yuǎn)大于圖形,所以一般不在由于圖像的數(shù)據(jù)量要遠(yuǎn)遠(yuǎn)大于圖形,所以一般不在程序中自行繪制圖像,而是把已經(jīng)存在于本機(jī)硬盤程序中自行繪制圖像,而是把已經(jīng)存在于本機(jī)硬盤或網(wǎng)絡(luò)某地的二進(jìn)制圖像文件直接調(diào)入
39、內(nèi)存。圖像或網(wǎng)絡(luò)某地的二進(jìn)制圖像文件直接調(diào)入內(nèi)存。圖像文件有多種格式,如文件有多種格式,如bmp文件、文件、gif文件、文件、tiff文件文件等等,其中等等,其中g(shù)if是是Internet上常用的圖像文件格式。上常用的圖像文件格式。Java中可以利用中可以利用Graphics類的類的drawImage( )方法顯示方法顯示圖像,現(xiàn)考察下面的例子。圖像,現(xiàn)考察下面的例子。例例 7-4 DrawMyImage.java 1: import java.awt.*;2: import java.applet.Applet;3: public class DrawMyImage extends Appl
40、et4: 5: Image myImage ;6: public void init( )7: 8: myImage = getImage(getDocumentBase( ), blackbrd.gif );9: 10: public void paint(Graphics g)11: 12: g.drawImage(myImage, 0, 0, this );13: 14: 例例7-4中,使用了中,使用了Image類的對(duì)象類的對(duì)象myImage來保存二進(jìn)來保存二進(jìn)制的圖像數(shù)據(jù),其中制的圖像數(shù)據(jù),其中g(shù)etImage( )方法是系統(tǒng)為方法是系統(tǒng)為Applet類定義的方法,該方法將指定圖像文件
41、的內(nèi)類定義的方法,該方法將指定圖像文件的內(nèi)容加載到內(nèi)存的容加載到內(nèi)存的Image對(duì)象中。對(duì)象中。getImage( )方法有兩方法有兩個(gè)參數(shù)。第一個(gè)是圖像文件所在的個(gè)參數(shù)。第一個(gè)是圖像文件所在的URL地址,在上地址,在上例中由于圖像文件與例中由于圖像文件與HTML文件保存在同一路徑下,文件保存在同一路徑下,所以用所以用Applet類另一個(gè)方法類另一個(gè)方法getDocumentBase( )來獲來獲取含有該取含有該Applet的的HTML文件的文件的URL地址。地址。getImage( ) 的第二個(gè)參數(shù)是圖像文件的文件名。的第二個(gè)參數(shù)是圖像文件的文件名。Java可識(shí)別的圖像文件格式有可識(shí)別的圖像
42、文件格式有bmp,gif,jpeg等。等。 drawImage( )是是Graphics類中用來顯示圖像的方法。類中用來顯示圖像的方法。它的第一個(gè)參數(shù)是保存有圖像數(shù)據(jù)的它的第一個(gè)參數(shù)是保存有圖像數(shù)據(jù)的Image對(duì)象。對(duì)象。第二、第三個(gè)參數(shù)是圖像的左上角點(diǎn)坐標(biāo),它們決第二、第三個(gè)參數(shù)是圖像的左上角點(diǎn)坐標(biāo),它們決定了圖像在容器中的顯示位置。最后一個(gè)參數(shù)是顯定了圖像在容器中的顯示位置。最后一個(gè)參數(shù)是顯示圖像的容器對(duì)象。例示圖像的容器對(duì)象。例7-4中的中的this代表了當(dāng)前的代表了當(dāng)前的Applet對(duì)象。對(duì)象。 7.2.5 實(shí)現(xiàn)動(dòng)畫效果實(shí)現(xiàn)動(dòng)畫效果動(dòng)畫曾是動(dòng)畫曾是Java Applet最吸引人的特性之
43、一。用最吸引人的特性之一。用Java實(shí)現(xiàn)動(dòng)畫的原理與放映動(dòng)畫片類似,取若干相關(guān)的實(shí)現(xiàn)動(dòng)畫的原理與放映動(dòng)畫片類似,取若干相關(guān)的圖像或圖片,順序、連續(xù)地在屏幕上先顯示,后擦圖像或圖片,順序、連續(xù)地在屏幕上先顯示,后擦除,循環(huán)往復(fù)就可以獲得動(dòng)畫的效果。參考下面的除,循環(huán)往復(fù)就可以獲得動(dòng)畫的效果。參考下面的例子。例子。例例 7-5 ShowAnimator.java 1: import java.applet.Applet;2: import java.awt.*;3:4: public class ShowAnimator extends Applet5: 6: Image m-Images;/保存
44、圖片序列的保存圖片序列的Image數(shù)組數(shù)組7: int totalImages = 18; /圖片序列中的圖片總數(shù)圖片序列中的圖片總數(shù)8: int currentImage = 0; /當(dāng)前時(shí)刻應(yīng)該顯示的圖片當(dāng)前時(shí)刻應(yīng)該顯示的圖片 序號(hào)序號(hào)9:10: public void init( )11: 12: m-Images = new ImagetotalImages;13: /從當(dāng)前目錄下的從當(dāng)前目錄下的images子目錄中將子目錄中將Img001.gif到到 Img0018.gif的文件加載的文件加載14: for(int i=0;itotalImages;i+)15: m-Imagesi
45、= getImage(getDocumentBase( ),imagesImg00+(i+1) + .gif);16: 17: public void start( )18: 19: currentImage = 0; /從第一幅開始顯示從第一幅開始顯示20: 21: public void paint(Graphics g)22: 23: g.drawImage(m-ImagescurrentImage,50,50,this); /顯示當(dāng)前序號(hào)的圖片顯示當(dāng)前序號(hào)的圖片24: currentImage = +currentImage % totalImages; /計(jì)算下一個(gè)應(yīng)顯示圖片的序號(hào)計(jì)
46、算下一個(gè)應(yīng)顯示圖片的序號(hào)25: try26: Thread.sleep(50); /程序休眠程序休眠50毫秒毫秒27: 28: catch(InterruptedException e) /處理執(zhí)行休眠方法可能引發(fā)的異常處理執(zhí)行休眠方法可能引發(fā)的異常29: 30: showStatus(e.toString( );31: 32: repaint( ); /圖片停留圖片停留50毫秒后被擦除,重新調(diào)毫秒后被擦除,重新調(diào) 用用paint( )顯示下一張圖片顯示下一張圖片33: 34: 例例7-5中使用了中使用了Thread.sleep( )方法,目的是使當(dāng)前的方法,目的是使當(dāng)前的程序線程休眠一段時(shí)間
47、,以便每幅圖片在下一幅圖程序線程休眠一段時(shí)間,以便每幅圖片在下一幅圖片顯示之前能在屏幕上逗留一小段時(shí)間,關(guān)于線程片顯示之前能在屏幕上逗留一小段時(shí)間,關(guān)于線程的具體編程將在以后的章節(jié)詳細(xì)介紹。第的具體編程將在以后的章節(jié)詳細(xì)介紹。第14句到第句到第15句的循環(huán)使用句的循環(huán)使用Applet的的getImage( )方法獲取所有方法獲取所有的的.gif圖像文件圖像文件(注意其目錄注意其目錄)。第。第21句到句到33句的句的paint( )方法一次顯示一幅圖像,稍待片刻后再顯示方法一次顯示一幅圖像,稍待片刻后再顯示Image對(duì)象數(shù)組中的下一幅圖像。圖對(duì)象數(shù)組中的下一幅圖像。圖7.4是例是例7-5的的運(yùn)行
48、結(jié)果。運(yùn)行結(jié)果。 圖圖 7.4 例例7-5的運(yùn)行結(jié)果的運(yùn)行結(jié)果在設(shè)計(jì)和實(shí)現(xiàn)程序的圖形用戶界面的過程中,繪制在設(shè)計(jì)和實(shí)現(xiàn)程序的圖形用戶界面的過程中,繪制用戶自定義成分僅僅完成了一部分工作,它可以裝用戶自定義成分僅僅完成了一部分工作,它可以裝飾、美化用戶界面,但卻無(wú)法接收程序運(yùn)行過程中飾、美化用戶界面,但卻無(wú)法接收程序運(yùn)行過程中的即時(shí)用戶指令,不能提供與用戶的動(dòng)態(tài)交互。的即時(shí)用戶指令,不能提供與用戶的動(dòng)態(tài)交互。Java中用來解決這個(gè)問題的機(jī)制是事件及其處理。中用來解決這個(gè)問題的機(jī)制是事件及其處理。7.3 Java的事件處理的事件處理圖形用戶界面之所以能為廣大用戶所喜愛并最終成圖形用戶界面之所以能為
49、廣大用戶所喜愛并最終成為事實(shí)上的標(biāo)準(zhǔn),很重要的一點(diǎn)就在于它可以用更為事實(shí)上的標(biāo)準(zhǔn),很重要的一點(diǎn)就在于它可以用更靈活、簡(jiǎn)便的方式來接收用戶命令。用戶在圖形用靈活、簡(jiǎn)便的方式來接收用戶命令。用戶在圖形用戶界面中輸入命令是通過移動(dòng)鼠標(biāo)對(duì)特定圖形界面戶界面中輸入命令是通過移動(dòng)鼠標(biāo)對(duì)特定圖形界面元素單擊、雙擊鼠標(biāo)鍵來實(shí)現(xiàn)的,為了能夠接收用元素單擊、雙擊鼠標(biāo)鍵來實(shí)現(xiàn)的,為了能夠接收用戶的命令,圖形用戶界面的系統(tǒng)首先應(yīng)該能夠識(shí)別戶的命令,圖形用戶界面的系統(tǒng)首先應(yīng)該能夠識(shí)別這些鼠標(biāo)和鍵盤的操作并做出相應(yīng)的響應(yīng)。這些鼠標(biāo)和鍵盤的操作并做出相應(yīng)的響應(yīng)。 通常每一個(gè)鍵盤或鼠標(biāo)操作會(huì)引發(fā)一個(gè)系統(tǒng)預(yù)先定通常每一個(gè)鍵盤或
50、鼠標(biāo)操作會(huì)引發(fā)一個(gè)系統(tǒng)預(yù)先定義好的事件,用戶程序只需要編制代碼定義每個(gè)特義好的事件,用戶程序只需要編制代碼定義每個(gè)特定事件發(fā)生時(shí)程序應(yīng)做出何種響應(yīng)即可。這些代碼定事件發(fā)生時(shí)程序應(yīng)做出何種響應(yīng)即可。這些代碼會(huì)在它們對(duì)應(yīng)的事件發(fā)生時(shí)由系統(tǒng)自動(dòng)調(diào)用,這就會(huì)在它們對(duì)應(yīng)的事件發(fā)生時(shí)由系統(tǒng)自動(dòng)調(diào)用,這就是圖形用戶界面中事件和事件響應(yīng)的基本原理。是圖形用戶界面中事件和事件響應(yīng)的基本原理。Java中,除了鍵盤和鼠標(biāo)操作,系統(tǒng)的狀態(tài)改變、中,除了鍵盤和鼠標(biāo)操作,系統(tǒng)的狀態(tài)改變、標(biāo)準(zhǔn)圖形界面元素等都可以引發(fā)事件,對(duì)這些事件標(biāo)準(zhǔn)圖形界面元素等都可以引發(fā)事件,對(duì)這些事件分別定義處理代碼,就可以保證應(yīng)用程序系統(tǒng)在不分別
51、定義處理代碼,就可以保證應(yīng)用程序系統(tǒng)在不同的狀況下都合理有效、有條不紊地正常工作。同的狀況下都合理有效、有條不紊地正常工作。Java的事件處理機(jī)制中引入了委托事件模型的事件處理機(jī)制中引入了委托事件模型(如圖如圖7.5所示所示),不同的事件由不同的監(jiān)聽者處理。,不同的事件由不同的監(jiān)聽者處理。圖圖 7.5 委托事件模型委托事件模型圖圖7.5中,圖形用戶界面的每個(gè)可能產(chǎn)生事件的組件中,圖形用戶界面的每個(gè)可能產(chǎn)生事件的組件被稱為事件源,不同事件源上發(fā)生的事件的種類不被稱為事件源,不同事件源上發(fā)生的事件的種類不同。例如,同。例如,Button對(duì)象或?qū)ο蠡騇enuItem對(duì)象等作為事對(duì)象等作為事件源可能引
52、發(fā)件源可能引發(fā)ActionEvent類代表的事件類代表的事件ACTION-PERFORMED;Checkbox對(duì)象等作為事件源可能對(duì)象等作為事件源可能引發(fā)引發(fā)ItemEvent類代表的事件類代表的事件ITEM-STATE-CHANGES。希望事件源上發(fā)生的事件被程序處理,就要把事件希望事件源上發(fā)生的事件被程序處理,就要把事件源注冊(cè)給能夠處理該事件源上那種類型事件的監(jiān)聽源注冊(cè)給能夠處理該事件源上那種類型事件的監(jiān)聽者 。 例 如者 。 例 如 B u t t o n 對(duì) 象 把 自 己 注 冊(cè) 給 實(shí) 現(xiàn) 了對(duì) 象 把 自 己 注 冊(cè) 給 實(shí) 現(xiàn) 了ActionListener接口的對(duì)象,因?yàn)橹挥?/p>
53、這種對(duì)象能接口的對(duì)象,因?yàn)橹挥羞@種對(duì)象能夠處理夠處理Button對(duì)象上發(fā)生的對(duì)象上發(fā)生的ActionEvent類的事件,類的事件,監(jiān)聽者可以是包容事件源的容器,也可以是另外的監(jiān)聽者可以是包容事件源的容器,也可以是另外的對(duì)象。具體的注冊(cè)方法是通過調(diào)用事件源本身的相對(duì)象。具體的注冊(cè)方法是通過調(diào)用事件源本身的相關(guān) 方 法 , 例 如 調(diào) 用關(guān) 方 法 , 例 如 調(diào) 用 B u t t o n 類 自 身 的類 自 身 的addActionListener( )方法,并以監(jiān)聽者對(duì)象作為實(shí)方法,并以監(jiān)聽者對(duì)象作為實(shí)際參數(shù)來實(shí)現(xiàn)的。際參數(shù)來實(shí)現(xiàn)的。監(jiān)聽者之所以成為監(jiān)聽者,并具有監(jiān)聽和處理某類監(jiān)聽者之所以
54、成為監(jiān)聽者,并具有監(jiān)聽和處理某類事件的功能,是因?yàn)樗鼘?shí)現(xiàn)了有關(guān)的接口,所以監(jiān)事件的功能,是因?yàn)樗鼘?shí)現(xiàn)了有關(guān)的接口,所以監(jiān)聽者需要對(duì)它所實(shí)現(xiàn)接口的所有抽象方法寫出具體聽者需要對(duì)它所實(shí)現(xiàn)接口的所有抽象方法寫出具體的方法體,對(duì)應(yīng)事件源上發(fā)生的事件的處理代碼就的方法體,對(duì)應(yīng)事件源上發(fā)生的事件的處理代碼就寫在這些方法體里。例如對(duì)寫在這些方法體里。例如對(duì)Button上發(fā)生的事件的上發(fā)生的事件的處理代碼應(yīng)該寫在處理代碼應(yīng)該寫在Button對(duì)象所注冊(cè)的監(jiān)聽者的對(duì)象所注冊(cè)的監(jiān)聽者的actionPerformed( )方法中,這個(gè)方法是對(duì)方法中,這個(gè)方法是對(duì)ActionListener接口中同名抽象方法的具體實(shí)現(xiàn)
55、。接口中同名抽象方法的具體實(shí)現(xiàn)。當(dāng)事件源上發(fā)生監(jiān)聽者可以處理的事件時(shí),事件源當(dāng)事件源上發(fā)生監(jiān)聽者可以處理的事件時(shí),事件源把這個(gè)事件作為實(shí)際參數(shù)傳遞給監(jiān)聽者中負(fù)責(zé)處理把這個(gè)事件作為實(shí)際參數(shù)傳遞給監(jiān)聽者中負(fù)責(zé)處理這類事件的方法這類事件的方法(委托委托),這個(gè)方法被系統(tǒng)自動(dòng)調(diào)用,這個(gè)方法被系統(tǒng)自動(dòng)調(diào)用執(zhí)行后,事件就得到了處理。執(zhí)行后,事件就得到了處理。這里,監(jiān)聽者并不一定是包容事件源的容器對(duì)象,這里,監(jiān)聽者并不一定是包容事件源的容器對(duì)象,這樣處理使得程序中的事件處理代碼與這樣處理使得程序中的事件處理代碼與GUI界面構(gòu)界面構(gòu)成代碼得以分離,有利于優(yōu)化程序結(jié)構(gòu);另外,由成代碼得以分離,有利于優(yōu)化程序結(jié)構(gòu)
56、;另外,由于于Java對(duì)事件作了詳細(xì)的分類并委托不同的接口方對(duì)事件作了詳細(xì)的分類并委托不同的接口方法加以處理,使得代碼性能得到提高。法加以處理,使得代碼性能得到提高。Java的所有事件類和處理事件的監(jiān)聽者接口都定義的所有事件類和處理事件的監(jiān)聽者接口都定義在在java.awt.event包中,其中事件類的層次結(jié)構(gòu)如圖包中,其中事件類的層次結(jié)構(gòu)如圖7.6所示。所示。圖圖 7.6 AWTEvent類體系結(jié)構(gòu)圖類體系結(jié)構(gòu)圖這個(gè)體系結(jié)構(gòu)圖中包括的事件類很多,它們都是這個(gè)體系結(jié)構(gòu)圖中包括的事件類很多,它們都是j a v a . a w t . A W T E v e n t 類 的 子 類 , 而類 的
57、子 類 , 而java.awt.AWTEvent類則是類則是java.util.EventObject類類的子類。的子類。EventObject有一個(gè)重要的方法有一個(gè)重要的方法getSource( )在前面已經(jīng)使用過,該方法返回產(chǎn)生事件的事件源,在前面已經(jīng)使用過,該方法返回產(chǎn)生事件的事件源,幾乎所有的事件類都要用到這個(gè)方法。需要注意的幾乎所有的事件類都要用到這個(gè)方法。需要注意的是,并非每個(gè)事件類都只對(duì)應(yīng)一個(gè)事件,例如是,并非每個(gè)事件類都只對(duì)應(yīng)一個(gè)事件,例如KeyEvent類可能對(duì)應(yīng)類可能對(duì)應(yīng)KEY-PRESSED(鍵按下鍵按下)、KEY-RELEASED(鍵松開鍵松開)、KEY-TYPED(擊
58、鍵擊鍵)三三個(gè)具體的事件。個(gè)具體的事件。判斷一個(gè)判斷一個(gè)KeyEvent類的對(duì)象到底代表哪種事件,可類的對(duì)象到底代表哪種事件,可以調(diào)用它的以調(diào)用它的getID( )方法并把方法的返回值與方法并把方法的返回值與KEY-PRESSED等幾個(gè)常量相比較。每個(gè)事件類的對(duì)象等幾個(gè)常量相比較。每個(gè)事件類的對(duì)象都擁有都擁有g(shù)etID( )方法,是它們從共同的父類方法,是它們從共同的父類AWTEvent那里繼承來的。那里繼承來的。java.awt.event包中還定義了包中還定義了11個(gè)監(jiān)聽者接口,每個(gè)個(gè)監(jiān)聽者接口,每個(gè)接口內(nèi)部包含了若干處理相關(guān)事件的抽象方法。一接口內(nèi)部包含了若干處理相關(guān)事件的抽象方法。一般
59、說來,每個(gè)事件類都有一個(gè)監(jiān)聽者接口與之相對(duì)般說來,每個(gè)事件類都有一個(gè)監(jiān)聽者接口與之相對(duì)應(yīng),而事件類中的每個(gè)具體事件類型都有一個(gè)具體應(yīng),而事件類中的每個(gè)具體事件類型都有一個(gè)具體的抽象方法與之相對(duì)應(yīng),當(dāng)具體事件發(fā)生時(shí),這個(gè)的抽象方法與之相對(duì)應(yīng),當(dāng)具體事件發(fā)生時(shí),這個(gè)事件將被封裝成一個(gè)事件類的對(duì)象作為實(shí)際參數(shù)傳事件將被封裝成一個(gè)事件類的對(duì)象作為實(shí)際參數(shù)傳遞給與之對(duì)應(yīng)的具體方法,由這個(gè)具體方法負(fù)責(zé)響遞給與之對(duì)應(yīng)的具體方法,由這個(gè)具體方法負(fù)責(zé)響應(yīng)并處理發(fā)生的事件。例如與應(yīng)并處理發(fā)生的事件。例如與ActionEvent類事件類事件對(duì)應(yīng)的接口是對(duì)應(yīng)的接口是ActionListener,這個(gè)接口定義了抽,這個(gè)
60、接口定義了抽象方法:象方法: public void actionPerformed(ActionEvent e); 凡是要處理凡是要處理ActionEvent事件的類都必須實(shí)現(xiàn)事件的類都必須實(shí)現(xiàn)ActionListener接口,實(shí)現(xiàn)接口,實(shí)現(xiàn)ActionListener接口就必接口就必須重載上述的須重載上述的actionPerformed()方法,在重載()方法,在重載的方法體中,通常需要調(diào)用參數(shù)的方法體中,通常需要調(diào)用參數(shù)e的有關(guān)方法。例的有關(guān)方法。例如調(diào)用如調(diào)用e.getSource查明產(chǎn)生查明產(chǎn)生ActionEvent事件的事事件的事件源,然后再采取相應(yīng)的措施處理該事件。件源,然后再采
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 副經(jīng)理安全生產(chǎn)責(zé)任制執(zhí)行標(biāo)準(zhǔn)
- 企業(yè)社會(huì)責(zé)任報(bào)告撰寫模板與范本
- 企業(yè)法中董事會(huì)罷免流程詳解
- 人力資源招聘流程規(guī)范與優(yōu)化方法
- 2024年天津市中考語(yǔ)文作文題庫(kù)解析
- 2026年橋梁檢測(cè)技術(shù)的未來發(fā)展趨勢(shì)
- 小學(xué)英語(yǔ)六年級(jí)公開課設(shè)計(jì)范例
- 電信行業(yè)客戶數(shù)據(jù)分析應(yīng)用
- 電力知識(shí)基礎(chǔ)講解課件
- 銀行柜員技能提升與崗位實(shí)操
- 2025-2026學(xué)年人教版九年級(jí)上冊(cè)歷史期末試卷(含答案和解析)
- 《小學(xué)語(yǔ)文六年級(jí)上冊(cè)第三單元復(fù)習(xí)》課件
- 小區(qū)配電室用電安全培訓(xùn)課件
- 杭州余杭水務(wù)有限公司2025年度公開招聘?jìng)淇碱}庫(kù)附答案詳解
- 鹿邑縣2025年事業(yè)單位引進(jìn)高層次人才備考題庫(kù)及答案詳解(新)
- 2025云南昆明巫家壩城市發(fā)展建設(shè)有限公司社會(huì)招聘14人筆試歷年難易錯(cuò)考點(diǎn)試卷帶答案解析
- 2025年大學(xué)(直播電商實(shí)訓(xùn))管理實(shí)操試題及答案
- 醫(yī)院重癥醫(yī)學(xué)科主任談重癥醫(yī)學(xué)治療
- 云南省2025年普通高中學(xué)業(yè)水平合格性考試地理試題
- 基礎(chǔ)土方回填施工工藝方案
- 2025年蘇州工業(yè)園區(qū)領(lǐng)軍創(chuàng)業(yè)投資有限公司招聘?jìng)淇碱}庫(kù)及一套答案詳解
評(píng)論
0/150
提交評(píng)論