java-圖形用戶界面設(shè)計(2)事件模型.ppt_第1頁
java-圖形用戶界面設(shè)計(2)事件模型.ppt_第2頁
java-圖形用戶界面設(shè)計(2)事件模型.ppt_第3頁
java-圖形用戶界面設(shè)計(2)事件模型.ppt_第4頁
java-圖形用戶界面設(shè)計(2)事件模型.ppt_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、AWT事件模型,NCEPU,Contents,1. AWT事件處理模型,NCEPU,為學(xué)生信息管理管理系統(tǒng)設(shè)計一個登陸界面,接受用戶輸入的賬號和密碼。界面如圖所示: 所需要的知識點 常用組件和容器的使用方法及功能 AWT事件處理模型,例,NCEPU,AWT事件模型,設(shè)計一個圖形界面,不僅僅需要畫出窗口并添加組件,更重要的是為組件設(shè)計相應(yīng)程序,使組件能夠響應(yīng)并處理用戶的操作,例如單擊按鈕,等等 當(dāng)Java程序運行時,如果用戶在界面上進(jìn)行某種操作,系統(tǒng)捕獲這些操作會引發(fā)相應(yīng)的事件(Event),然后執(zhí)行相應(yīng)的事件處理程序。 Java中定義了許多事件類,用來描述不同的用戶行為,NCEPU,事件與事件

2、處理,事件,就是發(fā)生在用戶界面上的用戶交互行為而產(chǎn)生的一種效果,如鼠標(biāo)的各種動作、鍵盤的操作以及發(fā)生在組件上的各種動作。 每發(fā)生一個事件,程序都需要作出相應(yīng)的響應(yīng),這稱為事件處理。,NCEPU,AWT事件模型,事件的來源 事件的來源是用戶的操作 每當(dāng)用戶在AWT組件上進(jìn)行某種操作,例如用鼠標(biāo)單擊按鈕,敲擊鍵盤等,AWT事件處理系統(tǒng)會生成一個相應(yīng)的事件對象 事件對象描述的是用戶所執(zhí)行的操作,用戶操作不同,事件對象的內(nèi)容也會不同。,NCEPU,AWT事件模型,事件的處理 事件的處理由事件處理程序完成 每個AWT組件都有自己的事件處理程序 當(dāng)事件對象生成時,AWT事件處理系統(tǒng)就會將這個事件對象傳遞給

3、所涉及的組件,由它們的事件處理程序進(jìn)行相應(yīng)處理,NCEPU,AWT事件模型,事件的模型 事件處理模型,是指事件產(chǎn)生后事件對象的傳遞模型 JDK 1.0 使用的是層次模型(hierarchal) JDK 1.1 使用的是委托模型(delegation),NCEPU,層次模型,JDK 1.0使用的層次事件處理模型主要基于容器和組件的包含關(guān)系 一個事件對象產(chǎn)生之后,首先被傳遞給直接相關(guān)的組件,該組件可以對事件進(jìn)行處理,也可以忽略。 若組件沒有對事件進(jìn)行處理,則AWT事件處理系統(tǒng)會將事件對象繼續(xù)向上傳遞給組件所在的容器 若容器將事件忽略,則AWT事件處理系統(tǒng)會將事件再繼續(xù)向上傳遞給容器所在的容器,NC

4、EPU,層次模型,示例:,Frame,Panel,Button1,Button2,層次事件處理模型中的事件都用Event 描述,Event是java.awt中定義的一個類, 它有如下幾個成員變量: Object target事件涉及的組件 long when事件發(fā)生的時間 int id事件的類型 int x, y事件產(chǎn)生的坐標(biāo)位置 Object arg與具體事件有關(guān)的參數(shù),事件類型包括: 窗口事件(移動窗口、關(guān)閉窗口等) 鼠標(biāo)事件(移動鼠標(biāo)、按下鼠標(biāo)鍵等) 焦點事件(獲得焦點、失去焦點) 鍵盤事件(按下或松開鍵) ACTION事件(按動按鈕等) 列表框事件(在列表框中進(jìn)行選擇) 滾動條事件(按

5、動其中的向上或向下按鈕),為了區(qū)分事件類型,需要用其事件分類標(biāo)志變量id來判斷事件是否屬于動作事件: if( Ev.id = ACTION_EVENT ),NCEPU,層次模型,示例:,Frame,Panel,Button1,Button2,生成Event的 一個實例,組件都繼承了Component類中的handleEvent()方法, handleEvent根據(jù)事件的類型調(diào)用不同的方法, 如果對事件進(jìn)行了處理,就返回true,否則返回false public boolean handleEvent (Event evt) switch (evt.id) case Event.MOUSE_EN

6、TER: return mouseEnter (evt, evt.x, evt.y); case Event.LOST_FOCUS: return lostFocus (evt, evt.x, evt.y); return false; ,public boolean mouseEnter (Event evt, int x, int y) return false; ,NCEPU,層次模型,import java.awt.*; public class Main extends Frame Label statusBar = new Label ( ); public static void

7、 main (String args) new Main (); Main () super (Example); add (South, statusBar); resize ( 200, 200); show ( ) ; ,NCEPU,層次模型,public class Main extends Frame public boolean handleEvent (Event evt) switch (evt.id) case Event.MOUSE_MOVE: return mouseMove (evt, evt.x, evt.y); case Event.MOUSE_DRAG: retu

8、rn mouseDrag (evt, evt.x, evt.y); case Event.WINDOW_DESTROY: hide();dispose (); System.exit(0); return true; return super.handleEvent(evt); ,NCEPU,層次模型,public class Main extends Frame public boolean mouseMove(Event evt,int x,int y) String status = (+evt.x+,+evt.y+); if (evt.controlDown() status += C

9、; if (evt.shiftDown() status += S; statusBar. setText (status); return true; public boolean mouseDrag(Event evt,int x,int y) String status = (+evt.x+,+evt.y+); if (evt.controlDown() status += C; if (evt.shiftDown() status += S; statusBar. setText (status); return true; ,NCEPU,層次模型,層次事件處理的優(yōu)點有: 簡單、容易理

10、解,基于面向?qū)ο蟮脑?層次事件處理的缺點有: 事件對象只能被引起該事件的組件或包含它的容器捕獲,而其他組件無法處理該事件 沒有簡單的事件過濾方法,要進(jìn)行事件處理,需要創(chuàng)建某個組件的子類,否則就必須為最外層的容器編寫復(fù)雜的handleEvent()及與之相關(guān)的方法,NCEPU,在JDK1.1中,事件處理模型將事件源(產(chǎn)生事件的組件)和對事件作出的具體處理(利用一種稱為監(jiān)聽器Listener的實體來對事件進(jìn)行具體的處理)分開。 一般情況下,組件(事件源)都不處理自己的事件,而是將事件處理委托給外部的處理實體(監(jiān)聽器),這種事件處理模型稱為事件的授權(quán)處理模型。不同的事件,可以交由不同類型的監(jiān)聽器去

11、處理。,委托模型,所有的組件都從Component類中繼承了將事件處理授權(quán)給監(jiān)聽器的方法: addXXXListener(ListenerType listener) removeXXXListener(ListenerType listener),NCEPU,用戶操作引發(fā)的事件對象仍然傳遞給相應(yīng)組件,組件注冊一個事件處理程序,這種事件處理程序稱為事件的監(jiān)聽程序(Listener)。,委托模型,NCEPU,委托模型,JDK 1.1使用的委托事件處理模型的基本思想是 用戶操作引發(fā)的事件仍然傳遞給相應(yīng)的組件 為了接收事件對象并進(jìn)行事件處理,組件必須注冊一個事件處理程序(事件監(jiān)聽程序Listener

12、)。 事件監(jiān)聽程序可以定義在組件所在的類中,也可以定義在其他類中。對事件的處理,由組件委托給事件監(jiān)聽程序所在的類來完成。,NCEPU,事件的監(jiān)聽程序可以定義在組件所在的類中,也可以定義在其他的類里; 而對事件的處理,則由組件委托給事件監(jiān)聽程序所在的類來完成。,委托模型,NCEPU,在委托事件處理模型下,事件對象只被傳遞給已經(jīng)注冊的監(jiān)聽程序。 根據(jù)用戶操作的不同,事件也被分成不同類型。 每種事件都有一個對應(yīng)的監(jiān)聽程序類,這個監(jiān)聽程序類應(yīng)實現(xiàn)了相應(yīng)的監(jiān)聽程序接口(Listener interface),并且定義了事件對象的接收和處理方法。,委托模型,NCEPU,委托模型,在委托事件處理模型中,Ja

13、va根據(jù)不同的用戶操作,產(chǎn)生不同的事件類(Event),如窗口事件類(Window Event)、單擊事件類(ActionEvent)等,并為每個事件類定義了事件監(jiān)聽程序(Listener) 這些事件監(jiān)聽程序的聲明在對應(yīng)的監(jiān)聽程序接口中,例如WindowListener、ActionListener等。,NCEPU,委托模型,示例:,Frame,Panel,Button1,Button2,Button1.addActionListener(this) /為按鈕Button1注冊了ActionEvent事件監(jiān)聽程序,系統(tǒng)捕獲操作,并產(chǎn)生ActionEvent事件,public void acti

14、onPerformed (ActionEvent e) /ActionListener接口中的Action事件處理程序,按鈕委托的事件監(jiān)聽程序類對象,NCEPU,AWT事件處理模型,在事件處理的過程中,主要涉及三類對象: Event-事件:用戶對界面操作在java語言上的描述,以類的形式出現(xiàn),例如鍵盤操作對應(yīng)的事件類是KeyEvent。 Event Source-事件源:事件發(fā)生的場所,通常就是各個組件,例如按鈕Button。 Event handler-事件處理者:接收事件對象并對其進(jìn)行處理的對象。,NCEPU,AWT事件處理模型,事件處理,事件,用戶對界面操作,以類的形式出現(xiàn),事件源,事件

15、發(fā)生的場所,通常就是各個組件,事件處理者,接收事件并對其進(jìn)行處理的對象,Event,Event Source,Event handler,NCEPU,事件源、事件、事件處理者之間的關(guān)系,組件(事件源),事件 對象,事件處理器,4,3,2,1,外部作用,生成事件對象,事件監(jiān)聽器注冊,把事件對象傳 入事件處理器,NCEPU,授權(quán)處理機(jī)制,不同的事件源上可能發(fā)生不同的事件:例如一個按鈕能夠發(fā)生ActionEvent類型的事件,而一個窗口能夠發(fā)生WindowEvent類型的事件 同一個事件源上可能發(fā)生多種事件:例如在Canvas對象上既可能發(fā)生鼠標(biāo)事件,也可能發(fā)生鍵盤事件 java采取授權(quán)處理機(jī)制(D

16、elegation Model):事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來處理。,NCEPU,授權(quán)處理機(jī)制,授權(quán)模型把事件的處理委托給外部的處理實體進(jìn)行處理,實現(xiàn)了將事件源和監(jiān)聽器分開的機(jī)制。,NCEPU,事件處理者(監(jiān)聽器),事件處理者(監(jiān)聽器)通常是一個類,負(fù)責(zé)處理一類事件 該類如果要能夠處理某種類型的事件,就必須實現(xiàn)與該事件類型相對應(yīng)的接口。 例如下例中類ButtonHandler之所以能夠處理ActionEvent事件,原因在于它實現(xiàn)了與ActionEvent事件對應(yīng)的接口ActionListener。每個事件類都有一個與之相對應(yīng)的接口。,NCEPU,事件處理

17、舉例,import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TestButton public static void main(String args) JFrame f = new JFrame(Test); JButton b = new JButton(Press Me!); b.addActionListener(new ButtonHandler(); f.setLayout(new FlowLayout(); f.add(b); f.setSize(200, 100); f.s

18、etVisible(true); ,Button 是事件源,class ButtonHandler implements ActionListener public void actionPerformed(ActionEvent e) System.out.println(Action occurred); ,事件,事件處理者,NCEPU,事件處理的實現(xiàn)步驟,對于某種類型的事件XXXEvent, 要想接收并處理這類事件,必須定義相應(yīng)的事件監(jiān)聽器類,該類需要實現(xiàn)與該事件相對應(yīng)的接口XXXListener。 進(jìn)行授權(quán),注冊該類事件的監(jiān)聽器,使用addXXXListener(XXXListener ) 方法來注冊監(jiān)聽器。,b.addActionListener(new ButtonHandler();,思考:可不可以用一個類本身實現(xiàn)監(jiān)聽器?,NCEPU,第二節(jié) 委托模型,import java.awt.*; import java.awt.event.*; public class TestButton public static void main (String args) Frame f = new Frame (Test); Button b = new Button (Pre

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論