第五講 AWT圖形用戶界面設(shè)計(jì)_第1頁(yè)
第五講 AWT圖形用戶界面設(shè)計(jì)_第2頁(yè)
第五講 AWT圖形用戶界面設(shè)計(jì)_第3頁(yè)
第五講 AWT圖形用戶界面設(shè)計(jì)_第4頁(yè)
第五講 AWT圖形用戶界面設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五講?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ù)傳送類,可以通過本地平臺(tái)的剪貼板來(lái)進(jìn)行剪切和粘貼。包java.awt包中提供了GUI設(shè)計(jì)所使用的類和接口

2、,可從圖5.1中看到主要類之間的關(guān)系。 java.awt包提供了基本的java程序的GUI設(shè)計(jì)工具。主要包括下述三個(gè)概念:組件-Component容器-Container布局管理器-LayoutManager組件和容器Java的圖形用戶界面的最基本組成部分是組件(Component),組件是一個(gè)可以以圖形化的方式顯示在屏幕上并能與用戶進(jìn)行交互的對(duì)象,例如一個(gè)按鈕,一個(gè)標(biāo)簽等。組件不能獨(dú)立地顯示出來(lái),必須將組件放在一定的容器中才可以顯示出來(lái)。類是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對(duì)象、大小、顯示位置、前景色和背景色、邊界、可見性等,因此許多組件類也就

3、繼承了Component類的成員方法和成員變量,相應(yīng)的成員方法包括:getComponentAt(int x, int y)getFont()getForeground()getName()getSize()paint(Graphics g)repaint()update()setVisible(boolean b)setSize(Dimension d)setName(String name)等容器(Container)也是一個(gè)類,實(shí)際上是Component的子類,因此容器本身也是一個(gè)組件,具有組件的所有性質(zhì),但是它的主要功能是容納其它組件和容器。布局管理器(LayoutManager):每

4、個(gè)容器都有一個(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)取消該容器的布局管理器

5、,方法為:setLayout(null);常用容器容器是Component的子類,一個(gè)容器可以容納多個(gè)組件,并使它們成為一個(gè)整體。容器可以簡(jiǎn)化圖形化界面的設(shè)計(jì),以整體結(jié)構(gòu)來(lái)布置界面。所有的容器都可以通過add()方法向容器中添加組件。有三種類型的容器:Window、Panel、ScrollPane,常用的有Panel, Frame, Applet。1Frame以下是容器的例子:例51public class MyFrame extends Framepublic static void main(String args )MyFrame fr = new MyFrame("Hello

6、 Out There!");/構(gòu)造方法fr.setSize(200,200);/設(shè)置Frame的大小,缺省為(0,0)fr.setBackground(Color.red);/設(shè)置Frame的背景,缺省為紅色fr.setVisible(true);/設(shè)置Frame為可見,缺省為不可見public MyFrame (String str)super(str); /調(diào)用父類的構(gòu)造方法查看運(yùn)行結(jié)果一般我們要生成一個(gè)窗口,通常是用Window的子類Frame來(lái)進(jìn)行實(shí)例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標(biāo)題、邊框、菜單、大小等等。

7、每個(gè)Frame的對(duì)象實(shí)例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( )來(lái)設(shè)置大小,調(diào)用setVisible(true)來(lái)設(shè)置該窗口為可見的。另外,AWT在實(shí)際的運(yùn)行過程中是調(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 str)super(str)

8、; public static void main(String args)FrameWithPanel 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);

9、 /用add方法把面板pan添加到框架fr中fr.setVisible(true); 查看運(yùn)行結(jié)果一般我們要生成一個(gè)窗口,通常是用Window的子類Frame來(lái)進(jìn)行實(shí)例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標(biāo)題、邊框、菜單、大小等等。每個(gè)Frame的對(duì)象實(shí)例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( )來(lái)設(shè)置大小,調(diào)用setVisible(true)來(lái)設(shè)置該窗口為可見的。另外,AWT在實(shí)際的運(yùn)行過程中是調(diào)用所在平臺(tái)的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺(tái)下運(yùn)行所看到的圖形系統(tǒng)是不一樣的。例如在windo

10、ws下運(yùn)行,則顯示的窗口是windows風(fēng)格的窗口;而在UNIX下運(yùn)行時(shí),則顯示的是UNIX風(fēng)格的窗口。布局管理器(1)java為了實(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)管理,不同的布局管理器使用不同算法和策略,容器可以通過選擇不同的布局管理器來(lái)決定布局。 布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout例53public c

11、lass ExGuiprivate Frame f;private Button b1;private Button b2;public static void main(String args)ExGui 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&quo

12、t;b2 = new Button("Don't Press 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)造方法主要

13、下面幾種:FlowLayout(FlowLayout.RIGHT,20,40);/*第一個(gè)參數(shù)表示組件的對(duì)齊方式,指組件在這一行中的位置是居中對(duì)齊、居右對(duì)齊還是居左對(duì)齊,第二個(gè)參數(shù)是組件之間的橫向間隔,第三個(gè)參數(shù)是組件之間的縱向間隔,單位是象素。*/FlowLayout(FlowLayout.LEFT);/居左對(duì)齊,橫向間隔和縱向間隔都是缺省值5個(gè)象素FlowLayout();/缺省的對(duì)齊方式居中對(duì)齊,橫向間隔和縱向間隔都是缺省值5個(gè)象素例54public class myButtonspublic static void main(String args)Frame f = new Fram

14、e();f.setLayout(new FlowLayout();Button button1 = 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ī)律是:

15、組件的大小不變,但是相對(duì)位置會(huì)發(fā)生變化。例如上圖中有三個(gè)按鈕都處于同一行,但是如果把該窗口變窄,窄到剛好能夠放下一個(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è)

16、區(qū)域的位置及大小如下圖所示:例55public class buttonDirpublic static void main(String args)Frame f = new Frame("BorderLayout");f.setLayout(new BorderLayout();f.add("North", new Button("North");/第一個(gè)參數(shù)表示把按鈕添加到容器的North區(qū)域f.add("South", new Button("South");/第一個(gè)參數(shù)表示把按鈕添加到

17、容器的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.setSize(200,200);f.setVisible(true);查看運(yùn)行結(jié)果在使用BorderLay

18、out的時(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ū)域)沒有組件,則由Center區(qū)域去補(bǔ)充,但是如果Center區(qū)域沒有組件,則保持空白,其效果如下幾幅圖所示:North區(qū)域缺少組件North和Center區(qū)域缺少組件3. GridLayout使容器中各個(gè)組件呈網(wǎng)格狀布局,平均占據(jù)容器的空間。例

19、56public class ButtonGrid public static void main(String args) Frame f = new Frame("GridLayout");f.setLayout(new GridLayout(3,2); /容器平均分成3行2列共6格f.add(new Button("1"); /添加到第一行的第一格f.add(new Button("2"); /添加到第一行的下一格f.add(new Button("3"); /添加到第二行的第一格f.add(new Butt

20、on("4"); /添加到第二行的下一格f.add(new Button("5"); /添加到第三行的第一格f.add(new Button("6"); /添加到第三行的下一格f.setSize(200,200);f.setVisible(true);布局管理器(2) 4. CardLayoutCardLayout布局管理器能夠幫助用戶處理兩個(gè)以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據(jù)整個(gè)容器的大小,但是每層只允許放置一個(gè)組件,當(dāng)然每層都可以利用Panel來(lái)實(shí)現(xiàn)復(fù)雜的用戶界面。牌布局管理器(CardLayo

21、ut)就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,每一張牌就相當(dāng)于牌布局管理器中的每一層。例57事件處理機(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; /多行多列的文

22、本區(qū)域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.addMouseLi

23、stener(this); /注冊(cè)監(jiān)聽器f.add(page2Label=new Label("Label page"),"page2Label");page2Label.addMouseLisener(this); /注冊(cè)監(jiān)聽器Panel panel=new Panel();panel.setLayout(new BorderLayout();panel.add(page3Text=new TextArea("Composite page"),"Center");page3Text.addMouseListene

24、r(this);panel.add(page3Top=new Button("Top button") , "North");page3Top.addMouseListener(this);panel.add(page3Bottom=new Button("Bottom button") ,"South");page3Bottom.addMouseListener(this);f.add(panel,"panel");f.setSize(200,200);f.setVisible(true);5

25、容器的嵌套在復(fù)雜的圖形用戶界面設(shè)計(jì)中,為了使布局更加易于管理,具有簡(jiǎn)潔的整體風(fēng)格,一個(gè)包含了多個(gè)組件的容器本身也可以作為一個(gè)組件加到另一個(gè)容器中去,容器中再添加容器,這樣就形成了容器的嵌套。下面是一個(gè)容器嵌套的例子。例58public class ExGui3private Frame f;private Panel p;private Button bw,bc;private Button bfile,bhelp;public static void main(String args)ExGui3 gui = new ExGui3();gui.go();public void go()f =

26、 new Frame("GUI example 3");bw=new Button("West");bc=new Button("Work space region");f.add(bw,"West");f.add(bc,"Center");p = new Panel();f.add(p,"North");bfile= new Button("File");bhelp= new Button("Help");p.add(bfile);p

27、.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 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某個(gè)區(qū)域顯示多個(gè)組件,達(dá)到設(shè)計(jì)復(fù)雜用戶界面的目的 。4如果采用無(wú)布局管理器 setLayout(null),則必須使用setLocation(),setSize()

28、,setBounds()等方法手工設(shè)置組件的大小和位置,此方法會(huì)導(dǎo)致平臺(tái)相關(guān),不鼓勵(lì)使用。5.2 AWT事件處理模型上一節(jié)中的主要內(nèi)容是如何放置各種組件,使圖形界面更加豐富多彩,但是還不能響應(yīng)用戶的任何操作,要能夠讓圖形界面接收用戶的操作,就必須給各個(gè)組件加上事件處理機(jī)制。在事件處理的過程中,主要涉及三類對(duì)象: Event-事件,用戶對(duì)界面操作在java語(yǔ)言上的描述,以類的形式出現(xiàn),例如鍵盤操作對(duì)應(yīng)的事件類是KeyEvent。 Event Source-事件源,事件發(fā)生的場(chǎng)所,通常就是各個(gè)組件,例如按鈕Button。 Event handler-事件處理者,接收事件對(duì)象并對(duì)其進(jìn)行處理的對(duì)象例如

29、,如果用戶用鼠標(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)傳遞過來(lái)的事件對(duì)象actionE并進(jìn)行相應(yīng)的處理。由于同一個(gè)事件源上可能發(fā)生多種事件,因此java采取了授權(quán)處理機(jī)制(Delegation Model),事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來(lái)處理。比如在Canvas對(duì)象上既可能發(fā)生鼠標(biāo)事件,也可能發(fā)生鍵盤事件,該Canvas對(duì)象就可以授權(quán)給事件處理者一來(lái)處理鼠標(biāo)事件,同時(shí)授權(quán)給事件處

30、理者二來(lái)處理鍵盤事件。有時(shí)也將事件處理者稱為監(jiān)聽器,主要原因也在于監(jiān)聽器時(shí)刻監(jiān)聽著事件源上所有發(fā)生的事件類型,一旦該事件類型與自己所負(fù)責(zé)處理的事件類型一致,就馬上進(jìn)行處理。授權(quán)模型把事件的處理委托給外部的處理實(shí)體進(jìn)行處理,實(shí)現(xiàn)了將事件源和監(jiān)聽器分開的機(jī)制。事件處理者(監(jiān)聽器)通常是一個(gè)類,該類如果要能夠處理某種類型的事件,就必須實(shí)現(xiàn)與該事件類型相對(duì)的接口。例如例5.9中類ButtonHandler之所以能夠處理ActionEvent事件,原因在于它實(shí)現(xiàn)了與ActionEvent事件對(duì)應(yīng)的接口ActionListener。每個(gè)事件類都有一個(gè)與之相對(duì)應(yīng)的接口。將事件源對(duì)象和事件處理器(事件監(jiān)聽器)

31、分開。如圖5.2所示打個(gè)不太恰當(dāng)?shù)谋扔鳎热缯f(shuō)有一位李先生,李先生可能會(huì)發(fā)生很多法律糾紛,可能是民事法律糾紛,也可能是刑事法律糾紛,那么李先生可以請(qǐng)律師,他可以授權(quán)王律師負(fù)責(zé)幫他打民事法律的官司,同時(shí)也可以授權(quán)張律師幫他打刑事法律的官司。這個(gè)請(qǐng)律師的過程從李先生的角度來(lái)看,就是授權(quán)的過程,而從王律師和張律師的角度來(lái)看,一旦被授權(quán),他們就得時(shí)刻對(duì)李先生負(fù)責(zé),"監(jiān)聽"著李先生,一旦發(fā)生民事糾紛了,王律師就要馬上去處理,而一旦發(fā)生刑事糾紛了,張律師就要馬上進(jìn)行處理。此時(shí)此刻,李先生就是事件源,王律師是一個(gè)事件處理者,張律師是另外一個(gè)事件處理者,民事糾紛和刑事糾紛就是不同類型的事件

32、。例5.9public class TestButton public static void main(String args)Frame f = new Frame("Test");Button b = new Button("Press Me!");b.addActionListener(new ButtonHandler(); /*注冊(cè)監(jiān)聽器進(jìn)行授權(quán),該方法的參數(shù)是事件處理者對(duì)象,要處理的事件類型可以從方法名中看出,例如本方法要授權(quán)處理的是ActionEvent,因?yàn)榉椒莂ddActionListener。*/f.setLayout(new

33、FlowLayout(); /設(shè)置布局管理器f.add(b);f.setSize(200,100);f.setVisible(true);class ButtonHandler 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)用本方法,需要做的操作就把代碼寫在則個(gè)方法里。使用授權(quán)處理模型進(jìn)行事件處理的一般方法歸納如下:

34、1對(duì)于某種類型的事件XXXEvent, 要想接收并處理這類事件,必須定義相應(yīng)的事件監(jiān)聽器類,該類需要實(shí)現(xiàn)與該事件相對(duì)應(yīng)的接口XXXListener;2事件源實(shí)例化以后,必須進(jìn)行授權(quán),注冊(cè)該類事件的監(jiān)聽器,使用addXXXListener(XXXListener ) 方法來(lái)注冊(cè)監(jiān)聽器。事件類與AWT有關(guān)的所有事件類都由類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級(jí)事件和高級(jí)事件。類是所有事件對(duì)象的基礎(chǔ)父類,所有事件都是由它派生出來(lái)的。AWT的相關(guān)事件繼承于類,這些AWT事件分為兩大類:低級(jí)事件和高級(jí)事件,低級(jí)事件是指基于組件和容器的事件,當(dāng)一個(gè)組件上發(fā)生

35、事件,如:鼠標(biāo)的進(jìn)入,點(diǎn)擊,拖放等,或組件的窗口開關(guān)等,觸發(fā)了組件事件。高級(jí)事件是基于語(yǔ)義的事件,它可以不和特定的動(dòng)作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,如在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( 鍵

36、盤事件:鍵按下、釋放)MouseEvent( 鼠標(biāo)事件:鼠標(biāo)單擊,移動(dòng)) 高級(jí)事件(語(yǔ)義事件)ActionEvent(動(dòng)作事件:按鈕按下,TextField中按Enter鍵)AdjustmentEvent(調(diào)節(jié)事件:在滾動(dòng)條上移動(dòng)滑塊以調(diào)節(jié)數(shù)值)ItemEvent(項(xiàng)目事件:選擇項(xiàng)目,不選擇"項(xiàng)目改變")TextEvent(文本事件,文本對(duì)象改變)事件監(jiān)聽器每類事件都有對(duì)應(yīng)的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動(dòng)作來(lái)定義方法。例如,與鍵盤事件KeyEvent相對(duì)應(yīng)的接口是:public interface KeyListener extends EventListener pub

37、lic void keyPressed(KeyEvent ev);public void keyReleased(KeyEvent ev);public 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 WindowListen

38、er extends EventListenerpublic void windowClosing(WindowEvent e);/把退出窗口的語(yǔ)句寫在本方法中public void windowOpened(WindowEvent e);/窗口打開時(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 windo

39、wActivated(WindowEvent e);/窗口激活時(shí)調(diào)用public void windowDeactivated(WindowEvent e);/窗口非激活時(shí)調(diào)用AWT的組件類中提供注冊(cè)和注銷監(jiān)聽器的方法: 注冊(cè)監(jiān)聽器:public void add<ListenerType> (<ListenerType>listener); 注銷監(jiān)聽器:public void remove<ListenerType> (<ListenerType>listener);例如Button類:(查API)public class Button ext

40、ends Component public synchronized void addActionListener(ActionListener l);public synchronized void removeActionListener(ActionListener l);事件及其相應(yīng)的監(jiān)聽器接口(1)表5.1列出了所有AWT事件及其相應(yīng)的監(jiān)聽器接口,一共10類事件,11個(gè)接口。下面這張表應(yīng)能牢牢記住。表5.1事件類別描述信息接口名方法ActionEvent激活組件ActionListeneractionPerformed(ActionEvent)ItemEvent選擇了某些項(xiàng)目Item

41、ListeneritemStateChanged(ItemEvent)MouseEvent鼠標(biāo)移動(dòng)MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠標(biāo)點(diǎn)擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)KeyEvent鍵盤輸入KeyListenerkeyPressed(KeyEvent)keyRe

42、leased(KeyEvent)keyTyped(KeyEvent)FocusEvent組件收到或失去焦點(diǎn)FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)AdjustmentEvent移動(dòng)了滾動(dòng)條等組件AdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentEvent對(duì)象移動(dòng)縮放顯示隱藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)compon

43、entResized(ComponentEvent)componentShown(ComponentEvent)WindowEvent窗口收到窗口級(jí)事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)ContainerEvent容器中增

44、加刪除了組件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)TextEvent文本字段或文本區(qū)發(fā)生改變TextListenertextValueChanged(TextEvent)?事件及其相應(yīng)的監(jiān)聽器接口(2)例5.10說(shuō)明事件處理模型的應(yīng)用。例5.10public class ThreeListener implements MouseMotionListener,MouseListener,WindowListener /實(shí)現(xiàn)了三個(gè)接口private Frame f;privat

45、e TextField tf;public static void main(String args)ThreeListener two = new ThreeListener();two.go(); public void go() f = new Frame("Three listeners example");f.add(new Label("Click and drag the mouse"),"North");tf = new TextField(30);f.add(tf,"South"); /使用缺省的

46、布局管理器f.addMouseMotionListener(this); /注冊(cè)監(jiān)聽器MouseMotionListenerf.addMouseListener(this); /注冊(cè)監(jiān)聽器MouseListenerf.addWindowListener(this); /注冊(cè)監(jiān)聽器WindowListenerf.setSize(300,200);f.setVisible(true);public void mouseDragged (MouseEvent e) /實(shí)現(xiàn)mouseDragged方法String s = "Mouse dragging : X="+e.getX()

47、+"Y = "+e.getY();tf.setText(s);public void mouseMoved(MouseEvent e)/對(duì)其不感興趣的方法可以方法體為空public void mouseClicked(MouseEvent e)public void mouseEntered(MouseEvent e)String s = "The mouse entered"tf.setText(s);public void mouseExited(MouseEvent e)String s = "The mouse has left the

48、 building"tf.setText(s);public void mousePressed(MouseEvent e)public void mouseReleased(MouseEvent e) public void windowClosing(WindowEvent e) /為了使窗口能正常關(guān)閉,程序正常退出,需要實(shí)現(xiàn)windowClosing方法System.exit(1);public void windowOpened(WindowEvent e) /對(duì)其不感興趣的方法可以方法體為空public void windowIconified(WindowEvent e)

49、 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)隔開。implements MouseMotionListener, MouseListener, WindowListener;2可以由同一個(gè)對(duì)象監(jiān)聽一個(gè)事件源上發(fā)生的多種事件:f.addMou

50、seMotionListener(this);f.addMouseListener(this);f.addWindowListener(this);則對(duì)象f 上發(fā)生的多個(gè)事件都將被同一個(gè)監(jiān)聽器接收和處理。3事件處理者和事件源處在同一個(gè)類中。本例中事件源是Frame f,事件處理者是類ThreeListener,其中事件源Frame f是類ThreeListener的成員變量。4可以通過事件對(duì)象獲得詳細(xì)資料,比如本例中就通過事件對(duì)象獲得了鼠標(biāo)發(fā)生時(shí)的坐標(biāo)值。public 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)代替。但卻必須所有方法都要寫上。事件適配器Java語(yǔ)言為一些Listener接口提供了適配器(Adapter)類??梢酝ㄟ^繼承事件所對(duì)應(yīng)的Adapter類,

溫馨提示

  • 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論