




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JAVA教程 第五講 AWT圖形用戶界面設(shè)計(jì)5.1 用AWT生成圖形化用戶界面 抽象窗口工具包AWT (Abstract Window Toolkit 是 API為Java 程序提供的建立圖形用戶界面GUI (Graphics User Interface工具集,AWT可用于Java的applet和applications中。它支持圖形用戶界面編程的功能包括: 用戶界面組件;事件處理模型;圖形和圖像工具,包括形狀、顏色和字體類;布局管理器,可以進(jìn)行靈活的窗口布局而與特定窗口的尺寸和屏幕分辨率無(wú)關(guān);數(shù)據(jù)傳送類,可以通過(guò)本地平臺(tái)的剪貼板來(lái)進(jìn)行剪切和粘貼。Java.awt包Java.awt包中提供了
2、GUI設(shè)計(jì)所使用的類和接口,可從圖5.1中看到主要類之間的關(guān)系。 java.awt包提供了基本的Java程序的GUI設(shè)計(jì)工具。主要包括下述三個(gè)概念:組件-Component容器-Container布局管理器-LayoutManagerJava的圖形用戶界面的最基本組成部分是組件(Component),組件是一個(gè)可以以圖形化的方式顯示在屏幕上并能與用戶進(jìn)行交互的對(duì)象,例如一個(gè)按鈕,一個(gè)標(biāo)簽等。組件不能獨(dú)立地顯示出來(lái),必須將組件放在一定的容器中才可以顯示出來(lái)。類是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對(duì)象、大小、顯示位置、前景色和背景色、邊界、可見(jiàn)性等,因
3、此許多組件類也就繼承了Component類的成員方法和成員變量,相應(yīng)的成員方法包括:getComponentAt(int x, int ygetFont(getForeground(getName(getSize(paint(Graphics grepaint(update(setVisible(boolean bsetSize(Dimension dsetName(String name等容器(Container也是一個(gè)類,實(shí)際上是Component的子類,因此容器本身也是一個(gè)組件,具有組件的所有性質(zhì),但是它的主要功能是容納其它組件和容器。布局管理器(LayoutManager):每個(gè)容器都
4、有一個(gè)布局管理器,當(dāng)容器需要對(duì)某個(gè)組件進(jìn)行定位或判斷其大小尺寸時(shí),就會(huì)調(diào)用其對(duì)應(yīng)的布局管理器。為了使我們生成的圖形用戶界面具有良好的平臺(tái)無(wú)關(guān)性,Java語(yǔ)言中,提供了布局管理器這個(gè)工具來(lái)管理組件在容器中的布局,而不使用直接設(shè)置組件位置和大小的方式。在程序中安排組件的位置和大小時(shí),應(yīng)該注意以下兩點(diǎn):1容器中的布局管理器負(fù)責(zé)各個(gè)組件的大小和位置,因此用戶無(wú)法在這種情況下設(shè)置組件的這些屬性。如果試圖使用Java 語(yǔ)言提供的setLocation(,setSize(,setBounds( 等方法,則都會(huì)被布局管理器覆蓋。 2如果用戶確實(shí)需要親自設(shè)置組件大小或位置,則應(yīng)取消該容器的布局管理器,方法為:s
5、etLayout(null; 容器是Component的子類,一個(gè)容器可以容納多個(gè)組件,并使它們成為一個(gè)整體。容器可以簡(jiǎn)化圖形化界面的設(shè)計(jì),以整體結(jié)構(gòu)來(lái)布置界面。所有的容器都可以通過(guò)add(方法向容器中添加組件。有三種類型的容器:Window、Panel、ScrollPane,常用的有Panel, Frame, Applet。1Frame以下是容器的例子:例51public class MyFrame extends Framepublic static void main(String args MyFrame fr = new MyFrame("Hello Out There!&
6、quot; /構(gòu)造方法fr.setSize(200,200; /設(shè)置Frame的大小,缺省為(0,0)fr.setBackground(Color.red; /設(shè)置Frame的背景,缺省為紅色fr.setVisible(true; /設(shè)置Frame為可見(jiàn),缺省為不可見(jiàn)public MyFrame (String strsuper(str; /調(diào)用父類的構(gòu)造方法查看運(yùn)行結(jié)果一般我們要生成一個(gè)窗口,通常是用Window的子類Frame來(lái)進(jìn)行實(shí)例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見(jiàn)到的窗口,有標(biāo)題、邊框、菜單、大小等等。每個(gè)Frame的對(duì)象實(shí)例化以后
7、,都是沒(méi)有大小和不可見(jiàn)的,因此必須調(diào)用setSize( 來(lái)設(shè)置大小,調(diào)用setVisible(true來(lái)設(shè)置該窗口為可見(jiàn)的。另外,AWT在實(shí)際的運(yùn)行過(guò)程中是調(diào)用所在平臺(tái)的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺(tái)下運(yùn)行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運(yùn)行,則顯示的窗口是windows風(fēng)格的窗口;而在UNIX下運(yùn)行時(shí),則顯示的是UNIX風(fēng)格的窗口。2. Panel例52public class FrameWithPanel extends Framepublic FrameWithPanel(String strsuper(str; public static voi
8、d main(String argsFrameWithPanel fr = new FrameWithPanel("Frame with Panel"Panel pan=new Panel(;fr.setSize(200,200;fr.setBackground(Color.red; /框架fr的背景顏色設(shè)置為紅色fr.setLayout(null; /取消布局管理器pan.setSize(100,100;pan.setBackground(Color.yellow; /設(shè)置面板pan的背景顏色為黃色fr.add(pan; /用add方法把面板pan添加到框架fr中fr.s
9、etVisible(true; 查看運(yùn)行結(jié)果一般我們要生成一個(gè)窗口,通常是用Window的子類Frame來(lái)進(jìn)行實(shí)例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見(jiàn)到的窗口,有標(biāo)題、邊框、菜單、大小等等。每個(gè)Frame的對(duì)象實(shí)例化以后,都是沒(méi)有大小和不可見(jiàn)的,因此必須調(diào)用setSize( 來(lái)設(shè)置大小,調(diào)用setVisible(true來(lái)設(shè)置該窗口為可見(jiàn)的。另外,AWT在實(shí)際的運(yùn)行過(guò)程中是調(diào)用所在平臺(tái)的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺(tái)下運(yùn)行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運(yùn)行,則顯示的窗口是windows風(fēng)格的窗口;而在U
10、NIX下運(yùn)行時(shí),則顯示的是UNIX風(fēng)格的窗口。布局管理器(1java為了實(shí)現(xiàn)跨平臺(tái)的特性并且獲得動(dòng)態(tài)的布局效果,Java將容器內(nèi)的所有組件安排給一個(gè)"布局管理器"負(fù)責(zé)管理,如:排列順序,組件的大小、位置,當(dāng)窗口移動(dòng)或調(diào)整大小后組件如何變化等功能授權(quán)給對(duì)應(yīng)的容器布局管理器來(lái)管理,不同的布局管理器使用不同算法和策略,容器可以通過(guò)選擇不同的布局管理器來(lái)決定布局。 布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout例53public class ExGuiprivate Frame f;priv
11、ate Button b1;private Button b2;public static void main(String argsExGui that = new ExGui(;that.go(;public void go(f = new Frame("GUI example"f.setLayout(new FlowLayout(; /設(shè)置布局管理器為FlowLayoutb1 = new Button("Press Me" /按鈕上顯示字符"Press Me"b2 = new Button("Don't Pre
12、ss Me"f.add(b1;f.add(b2;f.pack(; /緊湊排列,其作用相當(dāng)于setSize(,即讓窗口盡量小,小到剛剛能夠包容住b1、b2兩個(gè)按鈕f.setVisible(true;查看運(yùn)行結(jié)果1. FlowLayoutFlowLayout 是Panel,Applet的缺省布局管理器。其組件的放置規(guī)律是從上到下、從左到右進(jìn)行放置,如果容器足夠?qū)?,第一個(gè)組件先添加到容器中第一行的最左邊,后續(xù)的組件依次添加到上一個(gè)組件的右邊,如果當(dāng)前行已放置不下該組件,則放置到下一行的最左邊。構(gòu)造方法主要下面幾種:FlowLayout(FlowLayout.RIGHT,20,40;/*第一
13、個(gè)參數(shù)表示組件的對(duì)齊方式,指組件在這一行中的位置是居中對(duì)齊、居右對(duì)齊還是居左對(duì)齊,第二個(gè)參數(shù)是組件之間的橫向間隔,第三個(gè)參數(shù)是組件之間的縱向間隔,單位是象素。*/FlowLayout(FlowLayout.LEFT; /居左對(duì)齊,橫向間隔和縱向間隔都是缺省值5個(gè)象素FlowLayout(; /缺省的對(duì)齊方式居中對(duì)齊,橫向間隔和縱向間隔都是缺省值5個(gè)象素例54public class myButtons public static void main(String argsFrame f = new Frame(; f.setLayout(new FlowLayout(;Button butto
14、n1 = new Button("Ok"Button button2 = new Button("Open"Button button3 = new Button("Close"f.add(button1;f.add(button2;f.add(button3;f.setSize(300,100; f.setVisible(true;查看運(yùn)行結(jié)果當(dāng)容器的大小發(fā)生變化時(shí),用FlowLayout管理的組件會(huì)發(fā)生變化,其變化規(guī)律是:組件的大小不變,但是相對(duì)位置會(huì)發(fā)生變化。例如上圖中有三個(gè)按鈕都處于同一行,但是如果把該窗口變窄,窄到剛好能夠放
15、下一個(gè)按鈕,則第二個(gè)按鈕將折到第二行,第三個(gè)按鈕將折到第三行。按鈕"Open"本來(lái)在按鈕"OK"的右邊,但是現(xiàn)在跑到了下面,所以說(shuō)"組件的大小不變,但是相對(duì)位置會(huì)發(fā)生變化"。2. BorderLayoutBorderLayout 是Window,F(xiàn)rame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5個(gè)區(qū)域:North,South,East,West和Center,每個(gè)區(qū)域只能放置一個(gè)組件。各個(gè)區(qū)域的位置及大小如下圖所示:例55/第一個(gè)參數(shù)表示把按鈕添加到容器的North區(qū)域f.add("So
16、uth", new Button("South"/第一個(gè)參數(shù)表示把按鈕添加到容器的South區(qū)域f.add("East", new Button("East" /第一個(gè)參數(shù)表示把按鈕添加到容器的East區(qū)域f.add("West", new Button("West"/第一個(gè)參數(shù)表示把按鈕添加到容器的West區(qū)域f.add("Center", new Button("Center"/第一個(gè)參數(shù)表示把按鈕添加到容器的Center區(qū)域f.setSiz
17、e(200,200;f.setVisible(true; 查看運(yùn)行結(jié)果在使用BorderLayout的時(shí)候,如果容器的大小發(fā)生變化,其變化規(guī)律為:組件的相對(duì)位置不變,大小發(fā)生變化。例如容器變高了,則North、South區(qū)域不變,West、Center、East區(qū)域變高;如果容器變寬了,West、East區(qū)域不變,North、Center、South區(qū)域變寬。不一定所有的區(qū)域都有組件,如果四周的區(qū)域(West、East、North、South區(qū)域)沒(méi)有組件,則由Center區(qū)域去補(bǔ)充,但是如果Center區(qū)域沒(méi)有組件,則保持空白,其效果如下幾幅圖所示:North區(qū)域缺少組件North和Cent
18、er區(qū)域缺少組件3. GridLayout使容器中各個(gè)組件呈網(wǎng)格狀布局,平均占據(jù)容器的空間。例56/容器平均分成3行2列共6格f.add(new Button("1" /添加到第一行的第一格f.add(new Button("2" /添加到第一行的下一格f.add(new Button("3" /添加到第二行的第一格f.add(new Button("4" /添加到第二行的下一格f.add(new Button("5" /添加到第三行的第一格f.add(new Button("6&qu
19、ot; /添加到第三行的下一格f.setSize(200,200;f.setVisible(true;查看運(yùn)行結(jié)果 /事件處理機(jī)制,下一節(jié)的內(nèi)容public class ThreePages implements MousListener CardLayout layout=new CardLayout(; /實(shí)例化一個(gè)牌布局管理器對(duì)象Frame f=new Frame("CardLayout"Button page1Button;Label page2Label; /Label是標(biāo)簽,實(shí)際上是一行字符串TextArea page3Text; /多行多列的文本區(qū)域
20、Button page3Top;Button page3Bottom;public static void main(String args new ThreePages(.go(; Public void go( f.setLayout(layout; /設(shè)置為牌布局管理器layoutf.add(page1Button=new Button("Button page","page1Button" /*第二個(gè)參數(shù)"page1Button"表示的是你對(duì)這層牌所取的名字*/page1Button.addMouseListener(this
21、; /注冊(cè)監(jiān)聽(tīng)器f.add(page2Label=new Label("Label page","page2Label"page2Label.addMouseLisener(this; /注冊(cè)監(jiān)聽(tīng)器public void go(f = new Frame("GUI example 3"bw=new Button("West"bc=new Button("Work space region"f.add(bw,"West"f.add(bc,"Center"p
22、= new Panel(;f.add(p,"North"bfile= new Button("File"bhelp= new Button("Help"p.add(bfile;p.add(bhelp;f.pack(;f.setVisible(true;查看運(yùn)行結(jié)果小 結(jié):1Frame是一個(gè)頂級(jí)窗口。Frame的缺省布局管理器為BorderLayout。2Panel 無(wú)法單獨(dú)顯示,必須添加到某個(gè)容器中。 Panel 的缺省布局管理器為FlowLayout。3當(dāng)把Panel 作為一個(gè)組件添加到某個(gè)容器中后,該P(yáng)anel 仍然可以有自己的布
23、局管理器。因此,可以利用Panel 使得BorderLayout 中某個(gè)區(qū)域顯示多個(gè)組件,達(dá)到設(shè)計(jì)復(fù)雜用戶界面的目的 。4如果采用無(wú)布局管理器 setLayout(null,則必須使用setLocation(,setSize(,setBounds(等方法手工設(shè)置組件的大小和位置,此方法會(huì)導(dǎo)致平臺(tái)相關(guān),不鼓勵(lì)使用。5.2 AWT事件處理模型上一節(jié)中的主要內(nèi)容是如何放置各種組件,使圖形界面更加豐富多彩,但是還不能響應(yīng)用戶的任何操作,要能夠讓圖形界面接收用戶的操作,就必須給各個(gè)組件加上事件處理機(jī)制。在事件處理的過(guò)程中,主要涉及三類對(duì)象: Event-事件,用戶對(duì)界面操作在Java語(yǔ)言上的描述,以類的
24、形式出現(xiàn),例如鍵盤操作對(duì)應(yīng)的事件類是KeyEvent。 Event Source-事件源,事件發(fā)生的場(chǎng)所,通常就是各個(gè)組件,例如按鈕Button。 Event handler-事件處理者,接收事件對(duì)象并對(duì)其進(jìn)行處理的對(duì)象例如,如果用戶用鼠標(biāo)單擊了按鈕對(duì)象button,則該按鈕button就是事件源,而java運(yùn)行時(shí)系統(tǒng)會(huì)生成ActionEvent類的對(duì)象actionE,該對(duì)象中描述了該單擊事件發(fā)生時(shí)的一些信息,然后,事件處理者對(duì)象將接收由Java運(yùn)行時(shí)系統(tǒng)傳遞過(guò)來(lái)的事件對(duì)象actionE并進(jìn)行相應(yīng)的處理。由于同一個(gè)事件源上可能發(fā)生多種事件,因此Java采取了授權(quán)處理機(jī)制(Delegation
25、Model,事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來(lái)處理。比如在Canvas對(duì)象上既可能發(fā)生鼠標(biāo)事件,也可能發(fā)生鍵盤事件,該Canvas對(duì)象就可以授權(quán)給事件處理者一來(lái)處理鼠標(biāo)事件,同時(shí)授權(quán)給事件處理者二來(lái)處理鍵盤事件。有時(shí)也將事件處理者稱為監(jiān)聽(tīng)器,主要原因也在于監(jiān)聽(tīng)器時(shí)刻監(jiān)聽(tīng)著事件源上所有發(fā)生的事件類型,一旦該事件類型與自己所負(fù)責(zé)處理的事件類型一致,就馬上進(jìn)行處理。授權(quán)模型把事件的處理委托給外部的處理實(shí)體進(jìn)行處理,實(shí)現(xiàn)了將事件源和監(jiān)聽(tīng)器分開(kāi)的機(jī)制。事件處理者(監(jiān)聽(tīng)器)通常是一個(gè)類,該類如果要能夠處理某種類型的事件,就必須實(shí)現(xiàn)與該事件類型相對(duì)的接口。例如例5.9中類Bu
26、ttonHandler之所以能夠處理ActionEvent事件,原因在于它實(shí)現(xiàn)了與ActionEvent事件對(duì)應(yīng)的接口ActionListener。每個(gè)事件類都有一個(gè)與之相對(duì)應(yīng)的接口。將事件源對(duì)象和事件處理器(事件監(jiān)聽(tīng)器)分開(kāi)。如圖5.2所示打個(gè)不太恰當(dāng)?shù)谋扔?,比如說(shuō)有一位李先生,李先生可能會(huì)發(fā)生很多法律糾紛,可能是民事法律糾紛,也可能是刑事法律糾紛,那么李先生可以請(qǐng)律師,他可以授權(quán)王律師負(fù)責(zé)幫他打民事法律的官司,同時(shí)也可以授權(quán)張律師幫他打刑事法律的官司。這個(gè)請(qǐng)律師的過(guò)程從李先生的角度來(lái)看,就是授權(quán)的過(guò)程,而從王律師和張律師的角度來(lái)看,一旦被授權(quán),他們就得時(shí)刻對(duì)李先生負(fù)責(zé),"監(jiān)聽(tīng)&q
27、uot;著李先生,一旦發(fā)生民事糾紛了,王律師就要馬上去處理,而一旦發(fā)生刑事糾紛了,張律師就要馬上進(jìn)行處理。此時(shí)此刻,李先生就是事件源,王律師是一個(gè)事件處理者,張律師是另外一個(gè)事件處理者,民事糾紛和刑事糾紛就是不同類型的事件。例5.9/*注冊(cè)監(jiān)聽(tīng)器進(jìn)行授權(quán),該方法的參數(shù)是事件處理者對(duì)象,要處理的事件類型可以從方法名中看出,例如本方法要授權(quán)處理的是ActionEvent,因?yàn)榉椒莂ddActionListener。*/f.setLayout(new FlowLayout(; /設(shè)置布局管理器f.add(b;f.setSize(200,100;f.setVisible(true;class Bu
28、ttonHandler implements ActionListener /實(shí)現(xiàn)接口ActionListener才能做事件ActionEvent的處理者public void actionPerformed(ActionEvent e /系統(tǒng)產(chǎn)生的ActionEvent事件對(duì)象被當(dāng)作參數(shù)傳遞給該方法/本接口只有一個(gè)方法,因此事件發(fā)生時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用本方法,需要做的操作就把代碼寫(xiě)在則個(gè)方法里。使用授權(quán)處理模型進(jìn)行事件處理的一般方法歸納如下:1對(duì)于某種類型的事件XXXEvent, 要想接收并處理這類事件,必須定義相應(yīng)的事件監(jiān)聽(tīng)器類,該類需要實(shí)現(xiàn)與該事件相對(duì)應(yīng)的接口XXXListener;2事件
29、源實(shí)例化以后,必須進(jìn)行授權(quán),注冊(cè)該類事件的監(jiān)聽(tīng)器,使用addXXXListener(XXXListener 方法來(lái)注冊(cè)監(jiān)聽(tīng)器。 與AWT有關(guān)的所有事件類都由類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級(jí)事件和高級(jí)事件。類是所有事件對(duì)象的基礎(chǔ)父類,所有事件都是由它派生出來(lái)的。AWT的相關(guān)事件繼承于類,這些AWT事件分為兩大類:低級(jí)事件和高級(jí)事件,低級(jí)事件是指基于組件和容器的事件,當(dāng)一個(gè)組件上發(fā)生事件,如:鼠標(biāo)的進(jìn)入,點(diǎn)擊,拖放等,或組件的窗口開(kāi)關(guān)等,觸發(fā)了組件事件。高級(jí)事件是基于語(yǔ)義的事件,它可以不和特定的動(dòng)作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,
30、如在TextField中按Enter鍵會(huì)觸發(fā)ActionEvent事件,滑動(dòng)滾動(dòng)條會(huì)觸發(fā)AdjustmentEvent事件,或是選中項(xiàng)目列表的某一條就會(huì)觸發(fā)ItemEvent事件。 低級(jí)事件ComponentEvent( 組件事件:組件尺寸的變化,移動(dòng)) ContainerEvent( 容器事件:組件增加,移動(dòng)) WindowEvent( 窗口事件:關(guān)閉窗口,窗口閉合,圖標(biāo)化) FocusEvent( 焦點(diǎn)事件:焦點(diǎn)的獲得和丟失) KeyEvent( 鍵盤事件:鍵按下、釋放) MouseEvent( 鼠標(biāo)事件:鼠標(biāo)單擊,移動(dòng)) 高級(jí)事件(語(yǔ)義事件)ActionEvent(動(dòng)作事件:按鈕按下,T
31、extField中按Enter鍵)AdjustmentEvent(調(diào)節(jié)事件:在滾動(dòng)條上移動(dòng)滑塊以調(diào)節(jié)數(shù)值)ItemEvent(項(xiàng)目事件:選擇項(xiàng)目,不選擇"項(xiàng)目改變")TextEvent(文本事件,文本對(duì)象改變)每類事件都有對(duì)應(yīng)的事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)器是接口,根據(jù)動(dòng)作來(lái)定義方法。例如,與鍵盤事件KeyEvent相對(duì)應(yīng)的接口是:public interface KeyListener extends EventListener public void keyPressed(KeyEvent ev;public void keyReleased(KeyEvent ev;public
32、void keyTyped(KeyEvent ev;注意到在本接口中有三個(gè)方法,那么Java運(yùn)行時(shí)系統(tǒng)何時(shí)調(diào)用哪個(gè)方法?其實(shí)根據(jù)這三個(gè)方法的方法名就能夠知道應(yīng)該是什么時(shí)候調(diào)用哪個(gè)方法執(zhí)行了。當(dāng)鍵盤剛按下去時(shí),將調(diào)用keyPressed( 方法執(zhí)行,當(dāng)鍵盤抬起來(lái)時(shí),將調(diào)用keyReleased( 方法執(zhí)行,當(dāng)鍵盤敲擊一次時(shí),將調(diào)用keyTyped( 方法執(zhí)行。又例如窗口事件接口: public interface WindowListener extends EventListenerpublic void windowClosing(WindowEvent e; /把退出窗口的語(yǔ)句寫(xiě)在本方法中
33、public void windowOpened(WindowEvent e; /窗口打開(kāi)時(shí)調(diào)用public void windowIconified(WindowEvent e; /窗口圖標(biāo)化時(shí)調(diào)用public void windowDeiconified(WindowEvent e; /窗口非圖標(biāo)化時(shí)調(diào)用public void windowClosed(WindowEvent e;/窗口關(guān)閉時(shí)調(diào)用public void windowActivated(WindowEvent e; /窗口激活時(shí)調(diào)用public void windowDeactivated(WindowEvent e; /窗
34、口非激活時(shí)調(diào)用AWT的組件類中提供注冊(cè)和注銷監(jiān)聽(tīng)器的方法: 注冊(cè)監(jiān)聽(tīng)器:public void add ( listener; 注銷監(jiān)聽(tīng)器:public void remove ( listener; 例如Button類:(查API)public class Button extends Component public synchronized void addActionListener(ActionListener l;public synchronized void removeActionListener(ActionListener l;事件及其相應(yīng)的監(jiān)聽(tīng)器接口(1表5.1列出了所
35、有AWT事件及其相應(yīng)的監(jiān)聽(tīng)器接口,一共10類事件,11個(gè)接口。下面這張表應(yīng)能牢牢記住。表5.1事件類別描述信息接口名方法ActionEvent激活組件ActionListeneractionPerformed(ActionEventItemEvent選擇了某些項(xiàng)目ItemListeneritemStateChanged(ItemEventMouseEvent鼠標(biāo)移動(dòng)MouseMotionListenermouseDragged(MouseEventmouseMoved(MouseEvent鼠標(biāo)點(diǎn)擊等MouseListenermousePressed(MouseEventmouseRelease
36、d(MouseEventmouseEntered(MouseEventmouseExited(MouseEvent mouseClicked(MouseEventKeyEvent鍵盤輸入KeyListenerkeyPressed(KeyEventkeyReleased(KeyEventkeyTyped(KeyEventFocusEvent組件收到或失去焦點(diǎn)FocusListenerfocusGained(FocusEventfocusLost(FocusEventAdjustmentEvent移動(dòng)了滾動(dòng)條等組件AdjustmentListeneradjustmentValueChanged(A
37、djustmentEventComponentEvent對(duì)象移動(dòng)縮放顯示隱藏等ComponentListenercomponentMoved(ComponentEventcomponentHidden(ComponentEventcomponentResized(ComponentEventcomponentShown(ComponentEventp WindowEvent窗口收到窗口級(jí)事件WindowListenerwindowClosing(WindowEventwindowOpened(WindowEventwindowIconified(WindowEventwindowDeiconi
38、fied(WindowEventwindowClosed(WindowEventwindowActivated(WindowEventwindowDeactivated(WindowEvent p ContainerEvent容器中增加刪除了組件ContainerListenercomponentAdded(ContainerEventcomponentRemoved(ContainerEvent p TextEvent文本字段或文本區(qū)發(fā)生改變TextListenertextValueChanged(TextEvent例5.10說(shuō)明事件處理模型的應(yīng)用。例5.10 public class Th
39、reeListener implements MouseMotionListener,MouseListener,WindowListener /實(shí)現(xiàn)了三個(gè)接口private Frame f;private TextField tf; public static void main(String argsThreeListener two = new ThreeListener(;two.go(; public void go( f = new Frame("Three listeners example" f.add(new Label("Click and d
40、rag the mouse","North"tf = new TextField(30;f.add(tf,"South" /使用缺省的布局管理器f.addMouseMotionListener(this; /注冊(cè)監(jiān)聽(tīng)器MouseMotionListenerf.addMouseListener(this; /注冊(cè)監(jiān)聽(tīng)器MouseListenerf.addWindowListener(this; /注冊(cè)監(jiān)聽(tīng)器WindowListenerf.setSize(300,200;f.setVisible(true; public void mouseDra
41、gged (MouseEvent e /實(shí)現(xiàn)mouseDragged方法String s = "Mouse dragging : X="+e.getX(+"Y = "+e.getY(;tf.setText(s;public void mouseMoved(MouseEvent e /對(duì)其不感興趣的方法可以方法體為空public void mouseClicked(MouseEvent epublic void mouseEntered(MouseEvent eString s = "The mouse entered"tf.setTe
42、xt(s;public void mouseExited(MouseEvent eString s = "The mouse has left the building"tf.setText(s; public void mousePressed(MouseEvent epublic void mouseReleased(MouseEvent e public void windowClosing(WindowEvent e /為了使窗口能正常關(guān)閉,程序正常退出,需要實(shí)現(xiàn)windowClosing方法System.exit(1;public void windowOpene
43、d(WindowEvent e /對(duì)其不感興趣的方法可以方法體為空public void windowIconified(WindowEvent e public void windowDeiconified(WindowEvent e public void windowClosed(WindowEvent e public void windowActivated(WindowEvent e public void windowDeactivated(WindowEvent e 上例中有如下幾個(gè)特點(diǎn):1可以聲明多個(gè)接口,接口之間用逗號(hào)隔開(kāi)。implements MouseMotionLis
44、tener, MouseListener, WindowListener;2可以由同一個(gè)對(duì)象監(jiān)聽(tīng)一個(gè)事件源上發(fā)生的多種事件:f.addMouseMotionListener(this;f.addMouseListener(this;f.addWindowListener(this;則對(duì)象f 上發(fā)生的多個(gè)事件都將被同一個(gè)監(jiān)聽(tīng)器接收和處理。3事件處理者和事件源處在同一個(gè)類中。本例中事件源是Frame f,事件處理者是類ThreeListener,其中事件源Frame f是類ThreeListener的成員變量。4可以通過(guò)事件對(duì)象獲得詳細(xì)資料,比如本例中就通過(guò)事件對(duì)象獲得了鼠標(biāo)發(fā)生時(shí)的坐標(biāo)值。pub
45、lic void mouseDragged(MouseEvent e String s="Mouse dragging :X="+e.getX(+"Y="+e.getY(;tf.setText(s;Java語(yǔ)言類的層次非常分明,因而只支持單繼承,為了實(shí)現(xiàn)多重繼承的能力,Java用接口來(lái)實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,這種機(jī)制比多重繼承具有更簡(jiǎn)單、靈活、更強(qiáng)的功能。在AWT中就經(jīng)常用到聲明和實(shí)現(xiàn)多個(gè)接口。記住無(wú)論實(shí)現(xiàn)了幾個(gè)接口,接口中已定義的方法必須一一實(shí)現(xiàn),如果對(duì)某事件不感興趣,可以不具體實(shí)現(xiàn)其方法,而用空的方法體來(lái)代替。但卻必須所有方法都要寫(xiě)上。/只實(shí)現(xiàn)
46、需要的方法 例5.11;public class InnerClassprivate Frame f;private TextField tf;public InnerClass(f=new Frame("Inner classes example"tf=new TextField(30;public voidi launchFrame(Label label=new Label("Click and drag the mouse"f.add(label,BorderLayout.NORTH;f.add(tf,BorderLayout.SOUTH;f.a
47、ddMouseMotionListener(new MyMouseMotionListener(;/*參數(shù)為內(nèi)部類對(duì)象*/f.setSize(300,200;f.setVisible(true; class MyMouseMotionListener extends MouseMotionAdapter /*內(nèi)部類開(kāi)始*/public void mouseDragged(MouseEvent e String s="Mouse dragging: x="+e.getX(+"Y="+e.getY(;tf.setText(s; ;public static
48、void main(String args InnerClass obj=new InnerClass(;obj.launchFrame(;/內(nèi)部類結(jié)束/匿名類開(kāi)始public void mouseDragged(MouseEvent eString s="Mouse dragging: x="+e.getX(+"Y="+e.getY(;tf.setText(s; ; /匿名類結(jié)束 f.setSize(300,200;f.setVisible(true;public static void main(String args AnonymousClass obj=new AnonymousClass(;obj.launchFrame(;5.3 AWT組件庫(kù)(1本節(jié)從應(yīng)用的角度進(jìn)一步介紹AWT的一些組件,目的使大家加深對(duì)AWT
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療行業(yè)2025年人才流動(dòng)風(fēng)險(xiǎn)評(píng)估與培養(yǎng)體系構(gòu)建報(bào)告
- 城市地下綜合管廊運(yùn)營(yíng)風(fēng)險(xiǎn)識(shí)別與2025年社會(huì)穩(wěn)定評(píng)估報(bào)告
- 2025年線下演出市場(chǎng)演出市場(chǎng)演出活動(dòng)觀眾體驗(yàn)提升報(bào)告
- 2025年環(huán)保產(chǎn)業(yè)園循環(huán)經(jīng)濟(jì)發(fā)展模式綠色產(chǎn)業(yè)政策評(píng)估報(bào)告
- 部編人教版語(yǔ)文復(fù)習(xí)課程調(diào)整計(jì)劃
- 2025年生態(tài)茶園觀光旅游項(xiàng)目生態(tài)旅游教育培訓(xùn)體系構(gòu)建報(bào)告
- 2025年文化產(chǎn)業(yè)區(qū)域協(xié)同發(fā)展與文化資源整合的版權(quán)保護(hù)與利用報(bào)告
- 2025年互聯(lián)網(wǎng)醫(yī)療在線問(wèn)診質(zhì)量分析與改進(jìn)措施報(bào)告
- 2025年網(wǎng)絡(luò)直播行業(yè)規(guī)范化發(fā)展策略與商業(yè)模式創(chuàng)新路徑研究報(bào)告
- 康復(fù)醫(yī)療服務(wù)機(jī)構(gòu)連鎖化運(yùn)營(yíng)模式在2025年的醫(yī)療健康保險(xiǎn)合作研究報(bào)告
- 高中團(tuán)課考試試題及答案
- 集裝箱、大件貨物運(yùn)輸安全管理制度
- 青島版信息技術(shù)第二冊(cè)《第二單元 信息隱私與安全 1 個(gè)人隱私好習(xí)慣》教學(xué)設(shè)計(jì)
- Unit6RainorShine課文知識(shí)填空2024-2025學(xué)年人教版英語(yǔ)七年級(jí)下冊(cè)
- 三力老人測(cè)試題及答案
- 更換外窗施工方案
- 四年級(jí)下冊(cè)道德與法制全冊(cè)電子教案?jìng)湔n
- 《食源性疾病》課件
- JJF(鄂)149-2025 電力行業(yè)碳計(jì)量技術(shù)規(guī)范 火電機(jī)組碳排放量化
- 2025年春統(tǒng)編版語(yǔ)文一年級(jí)下冊(cè)第八單元單元任務(wù)群整體公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
- 《房顫教學(xué)查房》課件
評(píng)論
0/150
提交評(píng)論