




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第五講?AWT圖形用戶界面設(shè)計5.1 用AWT生成圖形化用戶界面 抽象窗口工具包AWT (Abstract Window Toolkit) 是 API為Java 程序提供的建立圖形用戶界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中。它支持圖形用戶界面編程的功能包括: 用戶界面組件;事件處理模型;圖形和圖像工具,包括形狀、顏色和字體類;布局管理器,可以進(jìn)行靈活的窗口布局而與特定窗口的尺寸和屏幕分辨率無關(guān);數(shù)據(jù)傳送類,可以通過本地平臺的剪貼板來進(jìn)行剪切和粘貼。包java.awt包中提供了GUI設(shè)計所使用的類和接口
2、,可從圖5.1中看到主要類之間的關(guān)系。 java.awt包提供了基本的java程序的GUI設(shè)計工具。主要包括下述三個概念:組件-Component容器-Container布局管理器-LayoutManager組件和容器Java的圖形用戶界面的最基本組成部分是組件(Component),組件是一個可以以圖形化的方式顯示在屏幕上并能與用戶進(jìn)行交互的對象,例如一個按鈕,一個標(biāo)簽等。組件不能獨(dú)立地顯示出來,必須將組件放在一定的容器中才可以顯示出來。類是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等,因此許多組件類也就
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)也是一個類,實(shí)際上是Component的子類,因此容器本身也是一個組件,具有組件的所有性質(zhì),但是它的主要功能是容納其它組件和容器。布局管理器(LayoutManager):每
4、個容器都有一個布局管理器,當(dāng)容器需要對某個組件進(jìn)行定位或判斷其大小尺寸時,就會調(diào)用其對應(yīng)的布局管理器。為了使我們生成的圖形用戶界面具有良好的平臺無關(guān)性,Java語言中,提供了布局管理器這個工具來管理組件在容器中的布局,而不使用直接設(shè)置組件位置和大小的方式。在程序中安排組件的位置和大小時,應(yīng)該注意以下兩點(diǎn):1容器中的布局管理器負(fù)責(zé)各個組件的大小和位置,因此用戶無法在這種情況下設(shè)置組件的這些屬性。如果試圖使用Java 語言提供的setLocation(),setSize(),setBounds() 等方法,則都會被布局管理器覆蓋。2如果用戶確實(shí)需要親自設(shè)置組件大小或位置,則應(yīng)取消該容器的布局管理器
5、,方法為:setLayout(null);常用容器容器是Component的子類,一個容器可以容納多個組件,并使它們成為一個整體。容器可以簡化圖形化界面的設(shè)計,以整體結(jié)構(gòu)來布置界面。所有的容器都可以通過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é)果一般我們要生成一個窗口,通常是用Window的子類Frame來進(jìn)行實(shí)例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標(biāo)題、邊框、菜單、大小等等。
7、每個Frame的對象實(shí)例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( )來設(shè)置大小,調(diào)用setVisible(true)來設(shè)置該窗口為可見的。另外,AWT在實(shí)際的運(yùn)行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運(yùn)行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運(yùn)行,則顯示的窗口是windows風(fēng)格的窗口;而在UNIX下運(yùn)行時,則顯示的是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é)果一般我們要生成一個窗口,通常是用Window的子類Frame來進(jìn)行實(shí)例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標(biāo)題、邊框、菜單、大小等等。每個Frame的對象實(shí)例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( )來設(shè)置大小,調(diào)用setVisible(true)來設(shè)置該窗口為可見的。另外,AWT在實(shí)際的運(yùn)行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運(yùn)行所看到的圖形系統(tǒng)是不一樣的。例如在windo
10、ws下運(yùn)行,則顯示的窗口是windows風(fēng)格的窗口;而在UNIX下運(yùn)行時,則顯示的是UNIX風(fēng)格的窗口。布局管理器(1)java為了實(shí)現(xiàn)跨平臺的特性并且獲得動態(tài)的布局效果,java將容器內(nèi)的所有組件安排給一個"布局管理器"負(fù)責(zé)管理,如:排列順序,組件的大小、位置,當(dāng)窗口移動或調(diào)整大小后組件如何變化等功能授權(quán)給對應(yīng)的容器布局管理器來管理,不同的布局管理器使用不同算法和策略,容器可以通過選擇不同的布局管理器來決定布局。 布局管理器主要包括: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兩個按鈕f.setVisible(true);查看運(yùn)行結(jié)果1. FlowLayoutFlowLayout 是Panel,Applet的缺省布局管理器。其組件的放置規(guī)律是從上到下、從左到右進(jìn)行放置,如果容器足夠?qū)?,第一個組件先添加到容器中第一行的最左邊,后續(xù)的組件依次添加到上一個組件的右邊,如果當(dāng)前行已放置不下該組件,則放置到下一行的最左邊。構(gòu)造方法主要
13、下面幾種:FlowLayout(FlowLayout.RIGHT,20,40);/*第一個參數(shù)表示組件的對齊方式,指組件在這一行中的位置是居中對齊、居右對齊還是居左對齊,第二個參數(shù)是組件之間的橫向間隔,第三個參數(shù)是組件之間的縱向間隔,單位是象素。*/FlowLayout(FlowLayout.LEFT);/居左對齊,橫向間隔和縱向間隔都是缺省值5個象素FlowLayout();/缺省的對齊方式居中對齊,橫向間隔和縱向間隔都是缺省值5個象素例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ā)生變化時,用FlowLayout管理的組件會發(fā)生變化,其變化規(guī)律是:
15、組件的大小不變,但是相對位置會發(fā)生變化。例如上圖中有三個按鈕都處于同一行,但是如果把該窗口變窄,窄到剛好能夠放下一個按鈕,則第二個按鈕將折到第二行,第三個按鈕將折到第三行。按鈕"Open"本來在按鈕"OK"的右邊,但是現(xiàn)在跑到了下面,所以說"組件的大小不變,但是相對位置會發(fā)生變化"。2. BorderLayoutBorderLayout 是Window,F(xiàn)rame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5個區(qū)域:North,South,East,West和Center,每個區(qū)域只能放置一個組件。各個
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");/第一個參數(shù)表示把按鈕添加到容器的North區(qū)域f.add("South", new Button("South");/第一個參數(shù)表示把按鈕添加到
17、容器的South區(qū)域f.add("East", new Button("East");/第一個參數(shù)表示把按鈕添加到容器的East區(qū)域f.add("West", new Button("West");/第一個參數(shù)表示把按鈕添加到容器的West區(qū)域f.add("Center", new Button("Center");/第一個參數(shù)表示把按鈕添加到容器的Center區(qū)域f.setSize(200,200);f.setVisible(true);查看運(yùn)行結(jié)果在使用BorderLay
18、out的時候,如果容器的大小發(fā)生變化,其變化規(guī)律為:組件的相對位置不變,大小發(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使容器中各個組件呈網(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布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據(jù)整個容器的大小,但是每層只允許放置一個組件,當(dāng)然每層都可以利用Panel來實(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í)例化一個牌布局管理器對象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"); /*第二個參數(shù)"page1Button"表示的是你對這層牌所取的名字*/page1Button.addMouseLi
23、stener(this); /注冊監(jiān)聽器f.add(page2Label=new Label("Label page"),"page2Label");page2Label.addMouseLisener(this); /注冊監(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è)計中,為了使布局更加易于管理,具有簡潔的整體風(fēng)格,一個包含了多個組件的容器本身也可以作為一個組件加到另一個容器中去,容器中再添加容器,這樣就形成了容器的嵌套。下面是一個容器嵌套的例子。例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是一個頂級窗口。Frame的缺省布局管理器為BorderLayout。2Panel 無法單獨(dú)顯示,必須添加到某個容器中。 Panel 的缺省布局管理器為FlowLayout。3當(dāng)把Panel 作為一個組件添加到某個容器中后,該P(yáng)anel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某個區(qū)域顯示多個組件,達(dá)到設(shè)計復(fù)雜用戶界面的目的 。4如果采用無布局管理器 setLayout(null),則必須使用setLocation(),setSize()
28、,setBounds()等方法手工設(shè)置組件的大小和位置,此方法會導(dǎo)致平臺相關(guān),不鼓勵使用。5.2 AWT事件處理模型上一節(jié)中的主要內(nèi)容是如何放置各種組件,使圖形界面更加豐富多彩,但是還不能響應(yīng)用戶的任何操作,要能夠讓圖形界面接收用戶的操作,就必須給各個組件加上事件處理機(jī)制。在事件處理的過程中,主要涉及三類對象: Event-事件,用戶對界面操作在java語言上的描述,以類的形式出現(xiàn),例如鍵盤操作對應(yīng)的事件類是KeyEvent。 Event Source-事件源,事件發(fā)生的場所,通常就是各個組件,例如按鈕Button。 Event handler-事件處理者,接收事件對象并對其進(jìn)行處理的對象例如
29、,如果用戶用鼠標(biāo)單擊了按鈕對象button,則該按鈕button就是事件源,而java運(yùn)行時系統(tǒng)會生成ActionEvent類的對象actionE,該對象中描述了該單擊事件發(fā)生時的一些信息,然后,事件處理者對象將接收由java運(yùn)行時系統(tǒng)傳遞過來的事件對象actionE并進(jìn)行相應(yīng)的處理。由于同一個事件源上可能發(fā)生多種事件,因此java采取了授權(quán)處理機(jī)制(Delegation Model),事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來處理。比如在Canvas對象上既可能發(fā)生鼠標(biāo)事件,也可能發(fā)生鍵盤事件,該Canvas對象就可以授權(quán)給事件處理者一來處理鼠標(biāo)事件,同時授權(quán)給事件處
30、理者二來處理鍵盤事件。有時也將事件處理者稱為監(jiān)聽器,主要原因也在于監(jiān)聽器時刻監(jiān)聽著事件源上所有發(fā)生的事件類型,一旦該事件類型與自己所負(fù)責(zé)處理的事件類型一致,就馬上進(jìn)行處理。授權(quán)模型把事件的處理委托給外部的處理實(shí)體進(jìn)行處理,實(shí)現(xiàn)了將事件源和監(jiān)聽器分開的機(jī)制。事件處理者(監(jiān)聽器)通常是一個類,該類如果要能夠處理某種類型的事件,就必須實(shí)現(xiàn)與該事件類型相對的接口。例如例5.9中類ButtonHandler之所以能夠處理ActionEvent事件,原因在于它實(shí)現(xiàn)了與ActionEvent事件對應(yīng)的接口ActionListener。每個事件類都有一個與之相對應(yīng)的接口。將事件源對象和事件處理器(事件監(jiān)聽器)
31、分開。如圖5.2所示打個不太恰當(dāng)?shù)谋扔?,比如說有一位李先生,李先生可能會發(fā)生很多法律糾紛,可能是民事法律糾紛,也可能是刑事法律糾紛,那么李先生可以請律師,他可以授權(quán)王律師負(fù)責(zé)幫他打民事法律的官司,同時也可以授權(quán)張律師幫他打刑事法律的官司。這個請律師的過程從李先生的角度來看,就是授權(quán)的過程,而從王律師和張律師的角度來看,一旦被授權(quán),他們就得時刻對李先生負(fù)責(zé),"監(jiān)聽"著李先生,一旦發(fā)生民事糾紛了,王律師就要馬上去處理,而一旦發(fā)生刑事糾紛了,張律師就要馬上進(jìn)行處理。此時此刻,李先生就是事件源,王律師是一個事件處理者,張律師是另外一個事件處理者,民事糾紛和刑事糾紛就是不同類型的事件
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(); /*注冊監(jiān)聽器進(jìn)行授權(quán),該方法的參數(shù)是事件處理者對象,要處理的事件類型可以從方法名中看出,例如本方法要授權(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事件對象被當(dāng)作參數(shù)傳遞給該方法/本接口只有一個方法,因此事件發(fā)生時,系統(tǒng)會自動調(diào)用本方法,需要做的操作就把代碼寫在則個方法里。使用授權(quán)處理模型進(jìn)行事件處理的一般方法歸納如下:
34、1對于某種類型的事件XXXEvent, 要想接收并處理這類事件,必須定義相應(yīng)的事件監(jiān)聽器類,該類需要實(shí)現(xiàn)與該事件相對應(yīng)的接口XXXListener;2事件源實(shí)例化以后,必須進(jìn)行授權(quán),注冊該類事件的監(jiān)聽器,使用addXXXListener(XXXListener ) 方法來注冊監(jiān)聽器。事件類與AWT有關(guān)的所有事件類都由類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級事件和高級事件。類是所有事件對象的基礎(chǔ)父類,所有事件都是由它派生出來的。AWT的相關(guān)事件繼承于類,這些AWT事件分為兩大類:低級事件和高級事件,低級事件是指基于組件和容器的事件,當(dāng)一個組件上發(fā)生
35、事件,如:鼠標(biāo)的進(jìn)入,點(diǎn)擊,拖放等,或組件的窗口開關(guān)等,觸發(fā)了組件事件。高級事件是基于語義的事件,它可以不和特定的動作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,如在TextField中按Enter鍵會觸發(fā)ActionEvent事件,滑動滾動條會觸發(fā)AdjustmentEvent事件,或是選中項(xiàng)目列表的某一條就會觸發(fā)ItemEvent事件。 低級事件ComponentEvent( 組件事件:組件尺寸的變化,移動)ContainerEvent( 容器事件:組件增加,移動)WindowEvent( 窗口事件:關(guān)閉窗口,窗口閉合,圖標(biāo)化)FocusEvent( 焦點(diǎn)事件:焦點(diǎn)的獲得和丟失)KeyEvent( 鍵
36、盤事件:鍵按下、釋放)MouseEvent( 鼠標(biāo)事件:鼠標(biāo)單擊,移動) 高級事件(語義事件)ActionEvent(動作事件:按鈕按下,TextField中按Enter鍵)AdjustmentEvent(調(diào)節(jié)事件:在滾動條上移動滑塊以調(diào)節(jié)數(shù)值)ItemEvent(項(xiàng)目事件:選擇項(xiàng)目,不選擇"項(xiàng)目改變")TextEvent(文本事件,文本對象改變)事件監(jiān)聽器每類事件都有對應(yīng)的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動作來定義方法。例如,與鍵盤事件KeyEvent相對應(yīng)的接口是:public interface KeyListener extends EventListener pub
37、lic void keyPressed(KeyEvent ev);public void keyReleased(KeyEvent ev);public void keyTyped(KeyEvent ev);注意到在本接口中有三個方法,那么java運(yùn)行時系統(tǒng)何時調(diào)用哪個方法?其實(shí)根據(jù)這三個方法的方法名就能夠知道應(yīng)該是什么時候調(diào)用哪個方法執(zhí)行了。當(dāng)鍵盤剛按下去時,將調(diào)用keyPressed( )方法執(zhí)行,當(dāng)鍵盤抬起來時,將調(diào)用keyReleased( )方法執(zhí)行,當(dāng)鍵盤敲擊一次時,將調(diào)用keyTyped( )方法執(zhí)行。又例如窗口事件接口:public interface WindowListen
38、er extends EventListenerpublic void windowClosing(WindowEvent e);/把退出窗口的語句寫在本方法中public void windowOpened(WindowEvent e);/窗口打開時調(diào)用public void windowIconified(WindowEvent e);/窗口圖標(biāo)化時調(diào)用public void windowDeiconified(WindowEvent e);/窗口非圖標(biāo)化時調(diào)用public void windowClosed(WindowEvent e);/窗口關(guān)閉時調(diào)用public void windo
39、wActivated(WindowEvent e);/窗口激活時調(diào)用public void windowDeactivated(WindowEvent e);/窗口非激活時調(diào)用AWT的組件類中提供注冊和注銷監(jiān)聽器的方法: 注冊監(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個接口。下面這張表應(yīng)能牢牢記住。表5.1事件類別描述信息接口名方法ActionEvent激活組件ActionListeneractionPerformed(ActionEvent)ItemEvent選擇了某些項(xiàng)目Item
41、ListeneritemStateChanged(ItemEvent)MouseEvent鼠標(biāo)移動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移動了滾動條等組件AdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentEvent對象移動縮放顯示隱藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)compon
43、entResized(ComponentEvent)componentShown(ComponentEvent)WindowEvent窗口收到窗口級事件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說明事件處理模型的應(yīng)用。例5.10public class ThreeListener implements MouseMotionListener,MouseListener,WindowListener /實(shí)現(xiàn)了三個接口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); /注冊監(jiān)聽器MouseMotionListenerf.addMouseListener(this); /注冊監(jiān)聽器MouseListenerf.addWindowListener(this); /注冊監(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)/對其不感興趣的方法可以方法體為空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) /對其不感興趣的方法可以方法體為空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) 上例中有如下幾個特點(diǎn):1可以聲明多個接口,接口之間用逗號隔開。implements MouseMotionListener, MouseListener, WindowListener;2可以由同一個對象監(jiān)聽一個事件源上發(fā)生的多種事件:f.addMou
50、seMotionListener(this);f.addMouseListener(this);f.addWindowListener(this);則對象f 上發(fā)生的多個事件都將被同一個監(jiān)聽器接收和處理。3事件處理者和事件源處在同一個類中。本例中事件源是Frame f,事件處理者是類ThreeListener,其中事件源Frame f是類ThreeListener的成員變量。4可以通過事件對象獲得詳細(xì)資料,比如本例中就通過事件對象獲得了鼠標(biāo)發(fā)生時的坐標(biāo)值。public void mouseDragged(MouseEvent e) String s="Mouse dragging :X="+e.getX()+"Y="+e.getY();tf.setText(s);Java語言類的層次非常分明,因而只支持單繼承,為了實(shí)現(xiàn)多重繼承的能力,Java用接口來實(shí)現(xiàn),一個類可以實(shí)現(xiàn)多個接口,這種機(jī)制比多重繼承具有更簡單、靈活、更強(qiáng)的功能。在AWT中就經(jīng)常用到聲明和實(shí)現(xiàn)多個接口。記住無論實(shí)現(xiàn)了幾個接口,接口中已定義的方法必須一一實(shí)現(xiàn),如果對某事件不感興趣,可以不具體實(shí)現(xiàn)其方法,而用空的方法體來代替。但卻必須所有方法都要寫上。事件適配器Java語言為一些Listener接口提供了適配器(Adapter)類??梢酝ㄟ^繼承事件所對應(yīng)的Adapter類,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 聯(lián)營合作協(xié)議
- 基本知識培訓(xùn)課件講課
- 主導(dǎo)型供應(yīng)鏈風(fēng)險剖析與分擔(dān)策略的深度探究
- 上海市屬高校資產(chǎn)經(jīng)營公司運(yùn)營模式:多維剖析與創(chuàng)新發(fā)展
- IDO1與Hsp90抑制劑類抗腫瘤藥物的設(shè)計、合成及生物活性探究
- 八年級數(shù)學(xué)數(shù)據(jù)分析提升單元試卷及答案
- 基層反洗錢基礎(chǔ)知識培訓(xùn)課件
- 新解讀《GB-T 39723-2020北斗地基增強(qiáng)系統(tǒng)通信網(wǎng)絡(luò)系統(tǒng)技術(shù)規(guī)范》
- 新解讀《GB-T 26548.4-2020手持便攜式動力工具 振動試驗(yàn)方法 第4部分:直柄式砂輪機(jī)》
- 心理委員面試題及答案
- 水電站安全生產(chǎn)應(yīng)急預(yù)案
- JJG 693-2011可燃?xì)怏w檢測報警器
- 消防水池監(jiān)理規(guī)劃樣本
- 移動通信課件(全)全書教學(xué)教程完整版電子教案最全幻燈片
- 藥監(jiān)系統(tǒng)官方培訓(xùn) 王似錦 非無菌藥品的控制菌檢查與不可接受微生物的評估
- 2022年版小學(xué)數(shù)學(xué)新課程標(biāo)準(zhǔn)測試題含答案【附新課標(biāo)解讀】
- 三花電子膨脹閥C51程序
- 麻醉與生理止血課件
- 聚谷氨酸項(xiàng)目建議書范文
- 模塊化低壓配電柜MODAN6000樣本_圖文
- 某辦公樓室內(nèi)外裝修改造工程施工進(jìn)度計劃橫道圖
評論
0/150
提交評論