Java語言程序設計與實現(xiàn)項目九-Java的事件處理機制_第1頁
Java語言程序設計與實現(xiàn)項目九-Java的事件處理機制_第2頁
Java語言程序設計與實現(xiàn)項目九-Java的事件處理機制_第3頁
Java語言程序設計與實現(xiàn)項目九-Java的事件處理機制_第4頁
Java語言程序設計與實現(xiàn)項目九-Java的事件處理機制_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、項目九 Java的事件處理機制 任務一 Java的事件處理 任務二 事件監(jiān)聽與處理 任務三 常用事件 任務四 拓展實訓23 七月 20222任務一 Java的事件處理任務要求:本任務要求了解Java事件處理機制的概述掌握Java事件處理中事件、事件源、監(jiān)聽器等概念能夠編寫簡單的Java事件處理程序 (一) 事件處理機制概述事件處理技術(shù)是Java用戶界面設計中一個十分重要的技術(shù)。用戶在圖形用戶界面中輸入命令是通過移動鼠標或單擊特定界面元素來實現(xiàn)的。為了能夠接收用戶的命令,界面系統(tǒng)首先應該能夠識別這些鼠標或鍵盤的操作并做出相應的反應。通常,一個鍵盤或鼠標的操作會激發(fā)一個系統(tǒng)預先定義好的事件,用戶只

2、需要設計程序代碼定義每個特定事件發(fā)生時所對應的響應操作,這些程序代碼將在它們對應的事件發(fā)生時由系統(tǒng)自動調(diào)用。在第8章編寫的程序中,對按鈕等組件進行單擊操作,都沒有什么反應,就是因為沒有為事件編寫相應的處理程序。Java.awt.event包中包含了許多用來處理事件的類和接口。 23 七月 2022(二) Java事件處理的基本概念1. 事件如果用戶單擊了某個按鈕,或組件的狀態(tài)發(fā)生了某種變化,或按下了某個鍵盤鍵等,此時都認為產(chǎn)生了某個事件(Event)。事件是系統(tǒng)在捕獲用戶界面操作過程中產(chǎn)生的代表相應操作的一個數(shù)據(jù)結(jié)構(gòu),是用戶操作在Java系統(tǒng)內(nèi)的數(shù)字表達,它描述了發(fā)生了什么事情。用戶與用戶界面

3、上的組件交互是通過響應各種事件來實現(xiàn)的,如用戶單擊了一個按鈕,意味著發(fā)生了一個按鈕事件。 23 七月 20222. 事件源(Event Source)產(chǎn)生事件的組件稱事件源。例如,若用戶用鼠標單擊了按鈕對象button,則該按鈕button就是事件源。3. 監(jiān)聽器監(jiān)聽器(Listener)是調(diào)用事件處理方法的對象,它能夠?qū)κ录催M行監(jiān)聽,以便對事件源所發(fā)生的事件做出相應的處理。事件源通過調(diào)用相應的方法將某個對象作為自己的監(jiān)聽器,如文本框可以調(diào)用以下方法注冊監(jiān)聽器:addActionListener(監(jiān)聽器)4. 事件注冊事件源為了將其上產(chǎn)生的事件傳遞給監(jiān)聽器接收并處理,應該提供注冊和注銷事件監(jiān)

4、聽器的方法。注冊監(jiān)聽器用于使該事件源上發(fā)生的事件能夠被監(jiān)聽器接收并處理,注銷監(jiān)聽器用于使監(jiān)聽器不能監(jiān)聽到該事件源上發(fā)生的事件。23 七月 20225. 監(jiān)聽器接口監(jiān)聽器接口(事件處理方法)是能夠接收、解析和處理事件類對象、實現(xiàn)和用戶交互的方法。監(jiān)聽器是一個對象,為了處理事件源發(fā)生的事件,監(jiān)聽器會自動調(diào)用一個方法。Java規(guī)定,為了使監(jiān)聽器能夠?qū)κ录此l(fā)生的事件做出處理,創(chuàng)建該監(jiān)聽器的類必須聲名實現(xiàn)相應的接口,即必須在類體中給出該接口中所有方法的方法體。那么當事件源發(fā)生事件時,監(jiān)聽器就會自動調(diào)用執(zhí)行被類實現(xiàn)的某個接口方法。23 七月 20226. 授權(quán)處理模型同一個事件源上可能發(fā)生多種事件。就

5、像學校每天可能有多種事情會發(fā)生,如學生的學籍注冊、專業(yè)選擇、班級分配、宿舍安排、選修課程等,學校會安排(授權(quán))不同的部門進行管理,如財務處管理學生學籍注冊、教務管理專業(yè)選擇、教學系管理班級分配等。23 七月 2022Java對事件的處理采取了這種稱為授權(quán)處理機制(Delegation Model)的方式,事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來處理。如在一個按鈕對象上既可能發(fā)生鼠標單擊事件,也可能發(fā)生鼠標雙擊事件,該按鈕對象可以授權(quán)給兩個事件處理者分別來處理單擊事件和雙擊事件。有時也將事件處理者稱為監(jiān)聽器,監(jiān)聽器時刻監(jiān)聽著事件源上所有發(fā)生的事件類型,一旦該事件類型與自

6、己所負責處理的事件類型一致,就馬上進行處理。授權(quán)模型把事件的處理委托給外部的處理實體進行處理,實現(xiàn)了將事件源和監(jiān)聽器分開的機制。也就是說,事件源和事件處理是分開的,一般組件都不處理自己的事件,而將事件處理委托給外部的處理實體,這種事件處理模型稱為授權(quán)處理模型。如圖9-1所示。23 七月 202223 七月 2022例9-1 設計一個窗口,窗口中有一個按鈕,當該按鈕被按下時,顯示Hello Java.消息提示框。23 七月 2022代碼如下:23 七月 202213任務二 事件監(jiān)聽與處理任務要求:本任務要求掌握Java事件處理步驟,包括如何確定事件監(jiān)聽器接口,給組件注冊監(jiān)聽器和在程序中定義類來實

7、現(xiàn)監(jiān)聽器接口,重寫接口中的所有方法。23 七月 2022Java運行時系統(tǒng)會生成ActionEvent類的對象actionE,該對象中描述了該單擊事件發(fā)生時的一些信息,然后,事件處理者對象將接收Java運行時系統(tǒng)傳遞過來的事件對象actionE并進行相應的處理。 Java事件處理如圖9-3所示,通常包含以下3個步驟。(1) 確定事件監(jiān)聽器的接口。(2) 給組件注冊監(jiān)聽器。 (3) 在程序中定義類來實現(xiàn)監(jiān)聽器接口,重寫接口中的所有方法。23 七月 2022(一) 事件監(jiān)聽器接口不同事件源上發(fā)生的事件種類是不同的,由不同的監(jiān)聽器處理。每類事件都有對應的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動作來定義方法。

8、例如:(1)JButton(按鈕)對象作為事件源可能引發(fā)ActionEvent類代表的事件ACTIONPERFORMED.(2)JCheckbox(復選框)對象等作為事件源可能引發(fā)的事件為ITEMSTATECHANGES。23 七月 2022編寫事件處理程序時,首先應確定關注的事件屬于何種監(jiān)聽器類型。系統(tǒng)提供的監(jiān)聽器是接口,它們定義在java.awt.event包中。 表9-1列出了所有AWT事件及其相應的監(jiān)聽器接口,共10類事件,11個接口。23 七月 202223 七月 2022事件類別描述信息接口名方 法ActionEvent激活構(gòu)件ActionListeneractionPerform

9、ed(ActionEvent)ItemEvent選擇了某些項ItemListeneritemStateChanged(ItemEvent)MouseEvent鼠標移動MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent) 鼠標點擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)23 七月 2022Key

10、Event鍵盤輸入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)FocusEvent構(gòu)件收到或失去焦點FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)AdjustmentEvent移動了滾動條等構(gòu)件AdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentEvent對象移動、縮放、顯示隱藏等ComponentListenercomponentMoved(Compo

11、nentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)23 七月 2022WindowEvent窗口收到窗口級事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(Win

12、dowEvent)windowDeactivated(WindowEvent)ContainerEvent容器中增加、刪除了構(gòu)件ContainerListenercontainerAdded(containerEvent)containerRemoved(containerEvent)TextEvent文本字段或文本域發(fā)生改變TextListenertextValueChanged(TextEvent)Java語言類的層次非常分明,因而只支持單繼承。為了實現(xiàn)多重繼承的能力,Java用接口來實現(xiàn),一個類可以實現(xiàn)多個接口,這種機制比多重繼承具有更簡單、更靈活、更強大的功能。在AWT中就經(jīng)常用到聲明

13、和實現(xiàn)多個接口。是無論實現(xiàn)了幾個接口,接口中已定義的方法必須一一實現(xiàn),雖然某些方法不需要具體的操作,但可以用空的方法體來代替,但必須所有方法都要寫上。23 七月 2022(二) 事件源的注冊在確定了監(jiān)聽器的類型后,要用事件源類的注冊方法來注冊一個監(jiān)聽器類的對象。這樣事件源產(chǎn)生的事件會傳送給已注冊的處理該類事件的監(jiān)聽器對象,該對象將自動調(diào)用相應的事件處理方法來處理該事件。注冊監(jiān)聽器可使用下列方法:事件源對象.add事件監(jiān)聽器(事件監(jiān)聽器對象); 23 七月 2022(三) 事件的相應處理完成事件源注冊后,要調(diào)用事件源本身的相關方法向監(jiān)聽者進行注冊。當事件源上發(fā)生監(jiān)聽者可以處理的事件時,事件源把這

14、個事件作為實際參數(shù)傳遞給監(jiān)聽者中負責這類事件的方法,這個方法被系統(tǒng)自動調(diào)用執(zhí)行后,事件就得到了處理。 23 七月 2022例9-2 設計3個按鈕,單擊不同的按鈕時,在窗口背景會顯示不同的顏色。23 七月 2022代碼如下:例9-3 在文本框中輸入用戶名和密碼,當輸入完按Enter鍵后,將輸入的內(nèi)容會通過消息提示框顯示出來。23 七月 2022代碼如下:(四) 事件適配器一旦指定一個類實現(xiàn)了某個事件監(jiān)聽器接口,就必須實現(xiàn)這個監(jiān)聽器接口的所有方法,否則你只能將你的類定義為抽象類而無法定義這個類的實例。為了方便起見,Java語言提供了事件適配器Adapter類,用來實現(xiàn)含有多個方法的類。這些Adap

15、ter類中的方法是空的。你可以繼承Adapter類,而且只需重寫你所需要的方法。Adapter類的目的就是將那些具有很多方法的監(jiān)聽器接口集合成為一個抽象類,使用戶不需要在程序中實現(xiàn)每個方法。Adapter類只是為了簡化編程而提供的一種23 七月 2022中間轉(zhuǎn)換工具,使程序員在定義監(jiān)聽器類時可以不必因直接實現(xiàn)監(jiān)聽器接口而被迫重寫所有的抽象方法。下面通過捕獲窗口事件說明使用事件監(jiān)聽器接口和事件適配器兩種方法的編程方式。JFrame對象是窗口事件(WindowEvent)的事件源,下面指定一個監(jiān)聽器對象:MyListener listener=new MyListener(); frame.add

16、WindowListener(listener); 23 七月 2022監(jiān)聽器對象要實現(xiàn)WindowListener接口。WindowListener接口中共有7個方法,它們分別對應如下個窗口事件:public interface WindowListenervoid windowOpened(WindowEvent e);void windowClosing(WindowEvent e);void windowClosed(WindowEvent e);void windowIconified(WindowEvent e);void windowDeiconified(WindowEvent

17、 e);void windowActivated(WindowEvent e);void windowDeactivated(WindowEvent e); 23 七月 20221.WindowListener接口的實現(xiàn)方法一定義一個類來實現(xiàn)WindowListener接口,根據(jù)需要在相應的方法中添加需要的代碼,然后讓其他方法為空即可。23 七月 2022例9-4 使用事件監(jiān)聽器接口方法關閉窗口。例9-5 使用事件適配器方法關閉窗口。23 七月 2022提示:因Java單繼承機制的限制,若要定義監(jiān)聽器類需要同時處理兩個以上的GUI事件,則只能直接實現(xiàn)有關的監(jiān)聽器接口,而無法通過繼承適配器類實現(xiàn)

18、。(五) 內(nèi)部類和匿名類在Java事件處理中的應用為了更好地加強類之間的聯(lián)系,在Java中可以把一個類聲明為另一個類的成員,這樣的類稱為被包容的類。被包容的類可以無條件地使用包容它的類的所有成員,包括私有成員。和其他類成員一樣,被包容的類可以被聲明為靜態(tài)類,非靜態(tài)被包容的類稱為內(nèi)部類。23 七月 2022例9-6 使用內(nèi)部類的方法,關閉窗口。23 七月 20221.import java.awt.*;2.import javax.swing.*;3.import java.awt.event.*;4.public class TestInnerClass /主類,注意此類不用繼承5. 6. J

19、Frame f=new JFrame(TestInnerClass);7. public TestInnerClass()8. MyInner m=new MyInner();9. f.addWindowListener(m); /注冊監(jiān)聽器 10. f.setSize(200,150);例9-6 使用內(nèi)部類的方法,關閉窗口。23 七月 202211. f.setVisible(true);12.13.public static void main(String args) 14. new TestInnerClass();15.16.class MyInner extends WindowA

20、dapter/定義內(nèi)部類17.18. public void windowClosing(WindowEvent e)19. System.exit(1);20. 21. 22. 例9-7 定義內(nèi)部類作為監(jiān)聽者實現(xiàn):單擊按鈕后改變窗口背景顏色。23 七月 2022代碼如下:23 七月 202238任務三 常用事件任務要求:本任務要求掌握ActionEvent類的使用掌握選擇事件處理ItemEvent類,掌握按鍵事件處理和鼠標事件處理。Swing的事件處理機制繼續(xù)沿用AWT的事件處理機制,因此基本的事件處理需要使用java.awt.event包中的類,另外,java.swing.event包中也

21、增加了一些新的事件及其監(jiān)聽器接口。Swing中事件源及其對應的事件監(jiān)聽器接口如表9-2所示。23 七月 202223 七月 2022表9-2 Swing中事件源及其對應的事件監(jiān)聽器接口Swing事件源事件監(jiān)聽接口所屬的包AbstractButtonJTextFieldTimerJDirectoryPane ActionListener java.awt.eventJScrollBarAdjustmentListenerjava.awt.eventJComponentAncestorListenerjavax.swing.eventDefaultCellEditorCellEditorListe

22、nerjavax.swing.eventAbstractButtonDefaultCaretJProgressBarJSliderJTabbedPane JViewport ChangeListenerjavax.swing.event23 七月 2022AbstractDocumentDocumentListenerjavax.swing.eventAbstractButtonJComboBoxItmeListenerjava.awt.eventJListListSelectionListenerjavax.swing.eventJMenuMenuListenerjavax.swing.ev

23、entAbstractActionJComponentTableColumn PropertyChangeListener java.awt.eventJTreeTreeSelectionListenerjavax.swing.eventJPopupMenuWindowListener(一) 激活構(gòu)件事件處理使用ActionEvent類圖形用戶界面(Graphics User Interface,GUI)是采用圖形方式顯示的計算機操作用戶界面。通過這個在前面的例子中,我們已經(jīng)使用過ActionEvent類,當用戶按下按鈕(JButton)或是在文本框(JTextField)中輸入文字后按Ent

24、er鍵時,便觸發(fā)了激活構(gòu)件事件(ActionEvent)。23 七月 2022ActionEven類只包含一個事件actionPerformed()。(1) 事件源包括:JButton、JTextField、JTextArea、JRadioButton、JCheckBox、jcomboBox、JMenuItem。(2) 需要實現(xiàn)的監(jiān)聽器接口為ActionListener。(3) 加入事件監(jiān)聽器為 addActionListener (監(jiān)聽器)。(4) 得理事件需要重寫的方法為actionPerformed()。(5)ActionEvent類的主要方法如下。void setActionComma

25、nd(String ac):設置按鈕動作命令。String getActionCommand():獲取按鈕動作命令。23 七月 2022例9-8 設置3個單選按鈕,顯示3門大學課程,用戶選擇后顯示用戶所選內(nèi)容23 七月 2022代碼如下:例9-9 使用組合框JcomboBox顯示城市列表,如圖9-9所示。用戶選擇列表選項后,在文本域內(nèi)顯示用戶所選內(nèi)容。23 七月 2022代碼如下:(二) 選擇事件處理使用ItemEvent類ItemEvent類中只包含一個事件ITEM_STATE_CHANGED。(1) 引發(fā)事件的動作包括: 改變復選框類JCheckbox對象的選中或不選中狀態(tài); 改變列表框類

26、JList對象選項的選中或不選中狀態(tài); 改變單選按鈕類JRadioButton對象的選中或不選中狀態(tài).23 七月 2022(2) 需要實現(xiàn)的監(jiān)聽器接口為ItemListener。(3) 加入事件監(jiān)聽器為 addItemListener(監(jiān)聽器)。(4) 處理事件需要重寫的方法為itemStateChanged()。(5)ItemEvent類的主要方法如下。public ItemSelectable getItemSelectable():返回引發(fā)選中狀態(tài)變化事件的事件源。public Object getItem():返回引發(fā)選中狀態(tài)變化事件的具體選項。public int getStateC

27、hange():返回具體的選中狀態(tài)變化類型。23 七月 2022例9-10 使用復選框類JCheckbox設置兩個選項:“粗體Bold”和“斜體Italic”,用戶選擇后,文本域中顯示內(nèi)容的字體會隨之改變23 七月 2022代碼如下:(三) 按鍵事件處理使用KeyEvent類處理鍵盤事件的程序要實現(xiàn)在java.awt.event包中定義的接口KeyListener,在這個接口中定義了未實現(xiàn)的鍵盤事件處理方法。KeyListener接口中有如下3個方法。(1)public void keyPressed(KeyEvente):處理按下鍵。(2)public void keyReleased(Ke

28、yEvente):處理松開鍵。(3)public void keyTyped(KeyEvente):處理敲擊鍵盤。23 七月 2022Java對于用戶按鍵的處理過程如下。假設當前鍵盤狀態(tài)為小寫狀態(tài),要輸入一個大寫字母“A”,我們的操作過程為:先按住Shift鍵不放,再按A鍵,然后松開。整個過程中Java會產(chǎn)生5個事件。(1) 按下Shift鍵:為VK_SHIFT調(diào)用keyPressed方法。(2) 按下A鍵:為VK_A調(diào)用keyPressed方法。(3) 輸入字符“A”:為字符“A”調(diào)用keyTyped方法。(4) 松開A鍵:為VK_A調(diào)用keyReleased方法。(5) 松開Shift鍵:

29、為VK_SHIFT調(diào)用keyReleased方法。23 七月 2022為識別引發(fā)鍵盤事件的按鍵,常用到KeyEvent類的如下方法。(1)public char getKeyChar():返回該事件中鍵的字符。例如,shift + a按鍵事件的返回值為A。(2)public static String getKeyText(int keyCode):返回描述鍵代碼的字符串。例如,HOME、F1 或A等。 23 七月 2022例9-11 以KeyListener接口處理KeyEvent事件。設計窗口布局,在窗口上方放置一個文本框,在窗口下方放置一個文本域,如圖9-13所示。當用戶操作鍵盤時,輸入的字符顯示在上方文本框中,觸發(fā)事件的名稱顯示在下方文本域中。23 七月 2022代碼如下:例9-12 以適配器方法處理KeyEvent事件。23 七月 2022(四) 鼠標事件處理處理鼠標事件的程序要實現(xiàn)在java.awt.event包中定義的兩個接口MouseListener和MouseMotionL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論