JAVA教程 第五講 AWT圖形用戶界面設(shè)計_第1頁
JAVA教程 第五講 AWT圖形用戶界面設(shè)計_第2頁
JAVA教程 第五講 AWT圖形用戶界面設(shè)計_第3頁
JAVA教程 第五講 AWT圖形用戶界面設(shè)計_第4頁
JAVA教程 第五講 AWT圖形用戶界面設(shè)計_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、JAVA教程 第五講 AWT圖形用戶界面設(shè)計5.1 用AWT生成圖形化用戶界面 抽象窗口工具包AWT (Abstract Window Toolkit 是 API為Java 程序提供的建立圖形用戶界面GUI (Graphics User Interface工具集,AWT可用于Java的applet和applications中。它支持圖形用戶界面編程的功能包括: 用戶界面組件;事件處理模型;圖形和圖像工具,包括形狀、顏色和字體類;布局管理器,可以進行靈活的窗口布局而與特定窗口的尺寸和屏幕分辨率無關(guān);數(shù)據(jù)傳送類,可以通過本地平臺的剪貼板來進行剪切和粘貼。Java.awt包Java.awt包中提供了

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

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

4、有一個布局管理器,當容器需要對某個組件進行定位或判斷其大小尺寸時,就會調(diào)用其對應(yīng)的布局管理器。為了使我們生成的圖形用戶界面具有良好的平臺無關(guān)性,Java語言中,提供了布局管理器這個工具來管理組件在容器中的布局,而不使用直接設(shè)置組件位置和大小的方式。在程序中安排組件的位置和大小時,應(yīng)該注意以下兩點:1容器中的布局管理器負責各個組件的大小和位置,因此用戶無法在這種情況下設(shè)置組件的這些屬性。如果試圖使用Java 語言提供的setLocation(,setSize(,setBounds( 等方法,則都會被布局管理器覆蓋。 2如果用戶確實需要親自設(shè)置組件大小或位置,則應(yīng)取消該容器的布局管理器,方法為:s

5、etLayout(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 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為可見,缺省為不可見public MyFrame (String strsuper(str; /調(diào)用父類的構(gòu)造方法查看運行結(jié)果一般我們要生成一個窗口,通常是用Window的子類Frame來進行實例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標題、邊框、菜單、大小等等。每個Frame的對象實例化以后

7、,都是沒有大小和不可見的,因此必須調(diào)用setSize( 來設(shè)置大小,調(diào)用setVisible(true來設(shè)置該窗口為可見的。另外,AWT在實際的運行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運行,則顯示的窗口是windows風格的窗口;而在UNIX下運行時,則顯示的是UNIX風格的窗口。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; 查看運行結(jié)果一般我們要生成一個窗口,通常是用Window的子類Frame來進行實例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標題、邊框、菜單、大小等等。每個Frame的對象實例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( 來設(shè)置大小,調(diào)用setVisible(true來設(shè)置該窗口為可見的。另外,AWT在實際的運行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運行,則顯示的窗口是windows風格的窗口;而在U

10、NIX下運行時,則顯示的是UNIX風格的窗口。布局管理器(1java為了實現(xiàn)跨平臺的特性并且獲得動態(tài)的布局效果,Java將容器內(nèi)的所有組件安排給一個"布局管理器"負責管理,如:排列順序,組件的大小、位置,當窗口移動或調(diào)整大小后組件如何變化等功能授權(quán)給對應(yīng)的容器布局管理器來管理,不同的布局管理器使用不同算法和策略,容器可以通過選擇不同的布局管理器來決定布局。 布局管理器主要包括: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(; /緊湊排列,其作用相當于setSize(,即讓窗口盡量小,小到剛剛能夠包容住b1、b2兩個按鈕f.setVisible(true;查看運行結(jié)果1. FlowLayoutFlowLayout 是Panel,Applet的缺省布局管理器。其組件的放置規(guī)律是從上到下、從左到右進行放置,如果容器足夠?qū)挘谝粋€組件先添加到容器中第一行的最左邊,后續(xù)的組件依次添加到上一個組件的右邊,如果當前行已放置不下該組件,則放置到下一行的最左邊。構(gòu)造方法主要下面幾種:FlowLayout(FlowLayout.RIGHT,20,40;/*第一

13、個參數(shù)表示組件的對齊方式,指組件在這一行中的位置是居中對齊、居右對齊還是居左對齊,第二個參數(shù)是組件之間的橫向間隔,第三個參數(shù)是組件之間的縱向間隔,單位是象素。*/FlowLayout(FlowLayout.LEFT; /居左對齊,橫向間隔和縱向間隔都是缺省值5個象素FlowLayout(; /缺省的對齊方式居中對齊,橫向間隔和縱向間隔都是缺省值5個象素例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;查看運行結(jié)果當容器的大小發(fā)生變化時,用FlowLayout管理的組件會發(fā)生變化,其變化規(guī)律是:組件的大小不變,但是相對位置會發(fā)生變化。例如上圖中有三個按鈕都處于同一行,但是如果把該窗口變窄,窄到剛好能夠放

15、下一個按鈕,則第二個按鈕將折到第二行,第三個按鈕將折到第三行。按鈕"Open"本來在按鈕"OK"的右邊,但是現(xiàn)在跑到了下面,所以說"組件的大小不變,但是相對位置會發(fā)生變化"。2. BorderLayoutBorderLayout 是Window,F(xiàn)rame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5個區(qū)域:North,South,East,West和Center,每個區(qū)域只能放置一個組件。各個區(qū)域的位置及大小如下圖所示:例55/第一個參數(shù)表示把按鈕添加到容器的North區(qū)域f.add("So

16、uth", new Button("South"/第一個參數(shù)表示把按鈕添加到容器的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.setSiz

17、e(200,200;f.setVisible(true; 查看運行結(jié)果在使用BorderLayout的時候,如果容器的大小發(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ū)域去補充,但是如果Center區(qū)域沒有組件,則保持空白,其效果如下幾幅圖所示:North區(qū)域缺少組件North和Cent

18、er區(qū)域缺少組件3. GridLayout使容器中各個組件呈網(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;查看運行結(jié)果 /事件處理機制,下一節(jié)的內(nèi)容public class ThreePages implements MousListener CardLayout layout=new CardLayout(; /實例化一個牌布局管理器對象Frame f=new Frame("CardLayout"Button page1Button;Label page2Label; /Label是標簽,實際上是一行字符串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" /*第二個參數(shù)"page1Button"表示的是你對這層牌所取的名字*/page1Button.addMouseListener(this

21、; /注冊監(jiān)聽器f.add(page2Label=new Label("Label page","page2Label"page2Label.addMouseLisener(this; /注冊監(jiān)聽器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;查看運行結(jié)果小 結(jié):1Frame是一個頂級窗口。Frame的缺省布局管理器為BorderLayout。2Panel 無法單獨顯示,必須添加到某個容器中。 Panel 的缺省布局管理器為FlowLayout。3當把Panel 作為一個組件添加到某個容器中后,該Panel 仍然可以有自己的布

23、局管理器。因此,可以利用Panel 使得BorderLayout 中某個區(qū)域顯示多個組件,達到設(shè)計復(fù)雜用戶界面的目的 。4如果采用無布局管理器 setLayout(null,則必須使用setLocation(,setSize(,setBounds(等方法手工設(shè)置組件的大小和位置,此方法會導(dǎo)致平臺相關(guān),不鼓勵使用。5.2 AWT事件處理模型上一節(jié)中的主要內(nèi)容是如何放置各種組件,使圖形界面更加豐富多彩,但是還不能響應(yīng)用戶的任何操作,要能夠讓圖形界面接收用戶的操作,就必須給各個組件加上事件處理機制。在事件處理的過程中,主要涉及三類對象: Event-事件,用戶對界面操作在Java語言上的描述,以類的

24、形式出現(xiàn),例如鍵盤操作對應(yīng)的事件類是KeyEvent。 Event Source-事件源,事件發(fā)生的場所,通常就是各個組件,例如按鈕Button。 Event handler-事件處理者,接收事件對象并對其進行處理的對象例如,如果用戶用鼠標單擊了按鈕對象button,則該按鈕button就是事件源,而java運行時系統(tǒng)會生成ActionEvent類的對象actionE,該對象中描述了該單擊事件發(fā)生時的一些信息,然后,事件處理者對象將接收由Java運行時系統(tǒng)傳遞過來的事件對象actionE并進行相應(yīng)的處理。由于同一個事件源上可能發(fā)生多種事件,因此Java采取了授權(quán)處理機制(Delegation

25、Model,事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來處理。比如在Canvas對象上既可能發(fā)生鼠標事件,也可能發(fā)生鍵盤事件,該Canvas對象就可以授權(quán)給事件處理者一來處理鼠標事件,同時授權(quán)給事件處理者二來處理鍵盤事件。有時也將事件處理者稱為監(jiān)聽器,主要原因也在于監(jiān)聽器時刻監(jiān)聽著事件源上所有發(fā)生的事件類型,一旦該事件類型與自己所負責處理的事件類型一致,就馬上進行處理。授權(quán)模型把事件的處理委托給外部的處理實體進行處理,實現(xiàn)了將事件源和監(jiān)聽器分開的機制。事件處理者(監(jiān)聽器)通常是一個類,該類如果要能夠處理某種類型的事件,就必須實現(xiàn)與該事件類型相對的接口。例如例5.9中類Bu

26、ttonHandler之所以能夠處理ActionEvent事件,原因在于它實現(xiàn)了與ActionEvent事件對應(yīng)的接口ActionListener。每個事件類都有一個與之相對應(yīng)的接口。將事件源對象和事件處理器(事件監(jiān)聽器)分開。如圖5.2所示打個不太恰當?shù)谋扔?,比如說有一位李先生,李先生可能會發(fā)生很多法律糾紛,可能是民事法律糾紛,也可能是刑事法律糾紛,那么李先生可以請律師,他可以授權(quán)王律師負責幫他打民事法律的官司,同時也可以授權(quán)張律師幫他打刑事法律的官司。這個請律師的過程從李先生的角度來看,就是授權(quán)的過程,而從王律師和張律師的角度來看,一旦被授權(quán),他們就得時刻對李先生負責,"監(jiān)聽&q

27、uot;著李先生,一旦發(fā)生民事糾紛了,王律師就要馬上去處理,而一旦發(fā)生刑事糾紛了,張律師就要馬上進行處理。此時此刻,李先生就是事件源,王律師是一個事件處理者,張律師是另外一個事件處理者,民事糾紛和刑事糾紛就是不同類型的事件。例5.9/*注冊監(jiān)聽器進行授權(quán),該方法的參數(shù)是事件處理者對象,要處理的事件類型可以從方法名中看出,例如本方法要授權(quán)處理的是ActionEvent,因為方法名是addActionListener。*/f.setLayout(new FlowLayout(; /設(shè)置布局管理器f.add(b;f.setSize(200,100;f.setVisible(true;class Bu

28、ttonHandler implements ActionListener /實現(xiàn)接口ActionListener才能做事件ActionEvent的處理者public void actionPerformed(ActionEvent e /系統(tǒng)產(chǎn)生的ActionEvent事件對象被當作參數(shù)傳遞給該方法/本接口只有一個方法,因此事件發(fā)生時,系統(tǒng)會自動調(diào)用本方法,需要做的操作就把代碼寫在則個方法里。使用授權(quán)處理模型進行事件處理的一般方法歸納如下:1對于某種類型的事件XXXEvent, 要想接收并處理這類事件,必須定義相應(yīng)的事件監(jiān)聽器類,該類需要實現(xiàn)與該事件相對應(yīng)的接口XXXListener;2事件

29、源實例化以后,必須進行授權(quán),注冊該類事件的監(jiān)聽器,使用addXXXListener(XXXListener 方法來注冊監(jiān)聽器。  與AWT有關(guān)的所有事件類都由類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級事件和高級事件。類是所有事件對象的基礎(chǔ)父類,所有事件都是由它派生出來的。AWT的相關(guān)事件繼承于類,這些AWT事件分為兩大類:低級事件和高級事件,低級事件是指基于組件和容器的事件,當一個組件上發(fā)生事件,如:鼠標的進入,點擊,拖放等,或組件的窗口開關(guān)等,觸發(fā)了組件事件。高級事件是基于語義的事件,它可以不和特定的動作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,

30、如在TextField中按Enter鍵會觸發(fā)ActionEvent事件,滑動滾動條會觸發(fā)AdjustmentEvent事件,或是選中項目列表的某一條就會觸發(fā)ItemEvent事件。 低級事件ComponentEvent( 組件事件:組件尺寸的變化,移動) ContainerEvent( 容器事件:組件增加,移動) WindowEvent( 窗口事件:關(guān)閉窗口,窗口閉合,圖標化) FocusEvent( 焦點事件:焦點的獲得和丟失) KeyEvent( 鍵盤事件:鍵按下、釋放) MouseEvent( 鼠標事件:鼠標單擊,移動) 高級事件(語義事件)ActionEvent(動作事件:按鈕按下,T

31、extField中按Enter鍵)AdjustmentEvent(調(diào)節(jié)事件:在滾動條上移動滑塊以調(diào)節(jié)數(shù)值)ItemEvent(項目事件:選擇項目,不選擇"項目改變")TextEvent(文本事件,文本對象改變)每類事件都有對應(yīng)的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動作來定義方法。例如,與鍵盤事件KeyEvent相對應(yīng)的接口是:public interface KeyListener extends EventListener public void keyPressed(KeyEvent ev;public void keyReleased(KeyEvent ev;public

32、void keyTyped(KeyEvent ev;注意到在本接口中有三個方法,那么Java運行時系統(tǒng)何時調(diào)用哪個方法?其實根據(jù)這三個方法的方法名就能夠知道應(yīng)該是什么時候調(diào)用哪個方法執(zhí)行了。當鍵盤剛按下去時,將調(diào)用keyPressed( 方法執(zhí)行,當鍵盤抬起來時,將調(diào)用keyReleased( 方法執(zhí)行,當鍵盤敲擊一次時,將調(diào)用keyTyped( 方法執(zhí)行。又例如窗口事件接口: public interface WindowListener extends EventListenerpublic void windowClosing(WindowEvent e; /把退出窗口的語句寫在本方法中

33、public void windowOpened(WindowEvent e; /窗口打開時調(diào)用public void windowIconified(WindowEvent e; /窗口圖標化時調(diào)用public void windowDeiconified(WindowEvent e; /窗口非圖標化時調(diào)用public void windowClosed(WindowEvent e;/窗口關(guān)閉時調(diào)用public void windowActivated(WindowEvent e; /窗口激活時調(diào)用public void windowDeactivated(WindowEvent e; /窗

34、口非激活時調(diào)用AWT的組件類中提供注冊和注銷監(jiān)聽器的方法: 注冊監(jiān)聽器:public void add ( listener; 注銷監(jiān)聽器: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)聽器接口(1表5.1列出了所

35、有AWT事件及其相應(yīng)的監(jiān)聽器接口,一共10類事件,11個接口。下面這張表應(yīng)能牢牢記住。表5.1事件類別描述信息接口名方法ActionEvent激活組件ActionListeneractionPerformed(ActionEventItemEvent選擇了某些項目ItemListeneritemStateChanged(ItemEventMouseEvent鼠標移動MouseMotionListenermouseDragged(MouseEventmouseMoved(MouseEvent鼠標點擊等MouseListenermousePressed(MouseEventmouseRelease

36、d(MouseEventmouseEntered(MouseEventmouseExited(MouseEvent mouseClicked(MouseEventKeyEvent鍵盤輸入KeyListenerkeyPressed(KeyEventkeyReleased(KeyEventkeyTyped(KeyEventFocusEvent組件收到或失去焦點FocusListenerfocusGained(FocusEventfocusLost(FocusEventAdjustmentEvent移動了滾動條等組件AdjustmentListeneradjustmentValueChanged(A

37、djustmentEventComponentEvent對象移動縮放顯示隱藏等ComponentListenercomponentMoved(ComponentEventcomponentHidden(ComponentEventcomponentResized(ComponentEventcomponentShown(ComponentEventp WindowEvent窗口收到窗口級事件WindowListenerwindowClosing(WindowEventwindowOpened(WindowEventwindowIconified(WindowEventwindowDeiconi

38、fied(WindowEventwindowClosed(WindowEventwindowActivated(WindowEventwindowDeactivated(WindowEvent p ContainerEvent容器中增加刪除了組件ContainerListenercomponentAdded(ContainerEventcomponentRemoved(ContainerEvent p TextEvent文本字段或文本區(qū)發(fā)生改變TextListenertextValueChanged(TextEvent例5.10說明事件處理模型的應(yīng)用。例5.10 public class Th

39、reeListener implements MouseMotionListener,MouseListener,WindowListener /實現(xiàn)了三個接口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; /注冊監(jiān)聽器MouseMotionListenerf.addMouseListener(this; /注冊監(jiān)聽器MouseListenerf.addWindowListener(this; /注冊監(jiān)聽器WindowListenerf.setSize(300,200;f.setVisible(true; public void mouseDra

41、gged (MouseEvent e /實現(xiàn)mouseDragged方法String s = "Mouse dragging : X="+e.getX(+"Y = "+e.getY(;tf.setText(s;public void mouseMoved(MouseEvent e /對其不感興趣的方法可以方法體為空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)閉,程序正常退出,需要實現(xiàn)windowClosing方法System.exit(1;public void windowOpene

43、d(WindowEvent e /對其不感興趣的方法可以方法體為空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 上例中有如下幾個特點:1可以聲明多個接口,接口之間用逗號隔開。implements MouseMotionLis

44、tener, MouseListener, WindowListener;2可以由同一個對象監(jiān)聽一個事件源上發(fā)生的多種事件:f.addMouseMotionListener(this;f.addMouseListener(this;f.addWindowListener(this;則對象f 上發(fā)生的多個事件都將被同一個監(jiān)聽器接收和處理。3事件處理者和事件源處在同一個類中。本例中事件源是Frame f,事件處理者是類ThreeListener,其中事件源Frame f是類ThreeListener的成員變量。4可以通過事件對象獲得詳細資料,比如本例中就通過事件對象獲得了鼠標發(fā)生時的坐標值。pub

45、lic void mouseDragged(MouseEvent e String s="Mouse dragging :X="+e.getX(+"Y="+e.getY(;tf.setText(s;Java語言類的層次非常分明,因而只支持單繼承,為了實現(xiàn)多重繼承的能力,Java用接口來實現(xiàn),一個類可以實現(xiàn)多個接口,這種機制比多重繼承具有更簡單、靈活、更強的功能。在AWT中就經(jīng)常用到聲明和實現(xiàn)多個接口。記住無論實現(xiàn)了幾個接口,接口中已定義的方法必須一一實現(xiàn),如果對某事件不感興趣,可以不具體實現(xiàn)其方法,而用空的方法體來代替。但卻必須所有方法都要寫上。/只實現(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)部類對象*/f.setSize(300,200;f.setVisible(true; class MyMouseMotionListener extends MouseMotionAdapter /*內(nè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é)束/匿名類開始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組件庫(1本節(jié)從應(yīng)用的角度進一步介紹AWT的一些組件,目的使大家加深對AWT

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論