Java程序設(shè)計——11事件處理.ppt_第1頁
Java程序設(shè)計——11事件處理.ppt_第2頁
Java程序設(shè)計——11事件處理.ppt_第3頁
Java程序設(shè)計——11事件處理.ppt_第4頁
Java程序設(shè)計——11事件處理.ppt_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機科學(xué)與技術(shù)學(xué)院 趙志崑 ,Java程序設(shè)計,GUI組件概述,awt:Abstract Window Toolkit抽象窗口工具集 從Java1.0中出現(xiàn)。 awt處理用戶界面元素的方法是把這些元素的創(chuàng)建和行為委托給每個目標(biāo)平臺(如windows,Linux)上的本地GUI處理。 每個平臺提供的圖形界面元素都不一樣。 不同平臺上的awt庫存在不同Bug。 awt的事件處理模型在Java1.1版進(jìn)行了大的改動后,到目前的版本基本沒變。 swing: Java 2.0中出現(xiàn)。 Swing組件全部是由純Java編寫的,用戶界面元素都繪制在空白窗口上,繪制和行為都由swing類自己完成。各平臺之間

2、唯一不同的就是最外層窗口的創(chuàng)建。 總結(jié): 盡管awt的用戶界面組件仍然可以用,但是建議最好不要使用。 現(xiàn)在編寫Java圖形界面程序,使用swing組件 + awt事件處理模型。,事件處理概述,圖形用戶界面編程中,必須使用事件處理。 程序的執(zhí)行不是一條連續(xù)的線,而是很多獨立的片段。 支持GUI的操作環(huán)境會不斷監(jiān)視事件,并把事件報告給正在運行的程序。這是多任務(wù)的需要。 每個程序自己決定如何響應(yīng)這些事件。 Java的事件處理采用的是事件監(jiān)聽器方式。 事件監(jiān)聽器是一個實現(xiàn)了監(jiān)聽器接口的對象。 事件源(如按鈕組件)是一個能夠注冊監(jiān)聽器并為它們發(fā)送事件的對象(可視構(gòu)件)。 每個事件源擁有自己的事件監(jiān)聽器,

3、可以有多個。 當(dāng)事件源產(chǎn)生了一個事件后,事件源就會給所有監(jiān)聽器對象發(fā)送通知,即調(diào)用事件監(jiān)聽器對象的相應(yīng)方法。 事件的信息被封裝在一個對象中,不同事件源能夠產(chǎn)生不同種類的事件。 編程人員要做的就是編寫事件監(jiān)聽器類,創(chuàng)建一個事件監(jiān)聽器對象,并添加到相應(yīng)的事件源。,事件監(jiān)聽器編寫,編寫事件處理程序的步驟如下: 編寫監(jiān)聽器類; 在監(jiān)聽器類中實現(xiàn)接口中需要的方法; 方法中可以使用ActionEvent對象獲取事件參數(shù); 創(chuàng)建一個事件監(jiān)聽器對象; 將該對象添加到事件源。,見Example1.java import java.awt.*; import java.awt.event.*; import ja

4、vax.swing.*; public class Example1 extends JFrame public Example1() setSize(320,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); JButton testButton = new JButton(Test); testButton.addActionListener(new MyListener1(); contentPane.setLayout(new BorderLayo

5、ut(); contentPane.add(testButton,BorderLayout.SOUTH); class MyListener1 implements ActionListener public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(null, ActionCommand:+e.getActionCommand(); ,事件源與監(jiān)聽器的關(guān)系,一個事件源可以對應(yīng)多個監(jiān)聽器。 一個監(jiān)聽器可以對應(yīng)多個事件源。,事件監(jiān)聽機制,事件監(jiān)聽器類的各種寫法,監(jiān)聽器類的聲明: 將事件監(jiān)聽器作為單獨的類。

6、將事件監(jiān)聽器作為組件的內(nèi)部類。 直接使用已有類(通常是包含事件源的組件)作為事件監(jiān)聽器。 使用匿名內(nèi)部類。 監(jiān)聽器類的實現(xiàn): 一個監(jiān)聽器類實現(xiàn)多個組件的監(jiān)聽器對象。 通過類中的實例字段來區(qū)分不同的監(jiān)聽器對象。 一個監(jiān)聽器對象作為多個組件的監(jiān)聽器。 在事件的響應(yīng)方法中通過事件源區(qū)分不同的事件。,public class Example1 extends JFrame implements ActionListener public void actionPerformed(ActionEvent e) ,見Example3.java redButton.addActionListener(new

7、 ActionListener() /匿名內(nèi)部類監(jiān)聽器 public void actionPerformed(ActionEvent e) );,改變觀感,改變觀感使用兩個靜態(tài)方法: UIManager.setLookAndFeel(plaf)設(shè)置要使用的觀感 參數(shù)plaf為觀感的名字,實際為一個類名,可以為以下字符串: javax.swing.plaf.metal.MetalLookAndFeel com.sun.java.swing.plaf.windows.WindowsLookAndFeel com.sun.java.swing.plaf.motif.MotifLookAndFeel

8、 SwingUtilities.updateComponentTreeUI(panel)刷新要改變的組件 參數(shù)panel給出面板中的一個組件即可刷新整個面板。,見Example4.java tButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent aEvent) try UIManager.setLookAndFeel(aPlafName); SwingUtilities.updateComponentTreeUI(Example4.this); catch(Exception

9、e) e.printStackTrace(); ; );,窗口事件,ActionListener接口非常簡單,用于按鈕事件處理。 相應(yīng)的,WindowListener接口用于窗口事件處理。,適配器類,問題:僅僅需要處理關(guān)閉窗口事件,但卻要寫另外六個空方法。 解決方法:使用適配器類。 適配器類是一個實現(xiàn)了某個接口,但其中所有方法都為空的類。 每個具有不止一個方法的監(jiān)聽器接口都對應(yīng)有一個適配器類。 編寫監(jiān)聽器類時只需從適配器類派生一個子類即可。,見Example6.java private class MyWindowListener extends WindowAdapter public vo

10、id windowClosing(WindowEvent e) int result = JOptionPane.showConfirmDialog(); if(result = JOptionPane.OK_OPTION)System.exit(0); ,由實現(xiàn)接口改為 繼承自適配器類, 從而不用再寫另 外六個無用方法。,見Example6.java addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) int result = JOptionPane.showConfirmDialog(

11、); if(result = JOptionPane.OK_OPTION)System.exit(0); );,也可寫成 匿名內(nèi)部類,Java事件概述,Java中所有事件都從java.util.EventObject類繼承而來。 兩個包中定義了事件: java.awt.event:awt的事件、監(jiān)聽器及適配器定義。 java.swing.event:專門用于swing組件的附加事件。 如何查找組件能夠產(chǎn)生哪些事件: 查找組件能夠添加哪些事件監(jiān)聽器(add*Listener) 根據(jù)該方法的參數(shù)查找相應(yīng)的接口,即可知道具體的事件含義 java.awt.event包中定義了11個監(jiān)聽器接口、7個適配

12、器類,java.awt.event包中的11個監(jiān)聽器接口 ActionListenerWindowListener AdjustmentListenerComponentListener ContainerListenerFocusListener ItemListenerKeyListener MouseListenerMouseMotionListener TextListener,java.awt.event包中的7個適配器類 WindowAdapterComponenAdapter ContainerAdapterFocusAdapter KeyAdapterMouseAdapter

13、MouseMotionAdapter,awt事件,雖然接口和類比較多,但原理都一樣。 定義實現(xiàn)監(jiān)聽器接口的監(jiān)聽器類,在相應(yīng)方法中添加事件處理代碼。 創(chuàng)建一個監(jiān)聽器類的對象,添加到事件源的監(jiān)聽器列表中。 awt事件分為語義事件和低級事件。 語義事件是有明確意義的事件。 ActionEvent:按鈕按下、菜單選擇、選擇列表項、文本域中按回車 AdjustmentEvent:調(diào)整滾動條 ItemEvent:從一組選擇框或列表項中選擇一個 TextEvent:文本域或文本框中內(nèi)容發(fā)生變化 低級事件是較小的基本事件。 ComponentEvent:組件被顯示、隱藏、改變位置、改變大小 KeyEvent:

14、鍵盤上的一個鍵被按下或者釋放 MouseEvent:鼠標(biāo)按鍵的按下和釋放,鼠標(biāo)移動或拖動 FocusEvent:組件得到焦點或失去焦點 WindowEvent:窗口被顯示、隱藏、關(guān)閉、激活、圖標(biāo)化、還原 ContainerEvent:容器中加入或移除一個組件,鍵盤事件,鍵盤事件監(jiān)聽器KeyListener有三個方法: void keyPressed(KeyEvent e):對應(yīng)于按鍵按下。 void keyReleased(KeyEvent e):對應(yīng)于按鍵彈起。 void keyTyped(KeyEvent e):結(jié)合上述兩個事件,直接報告按了按鍵,用于不須區(qū)分按下和彈起的情況。 鍵盤事件類

15、KeyEvent的主要方法有: char getKeyChar():得到按鍵對應(yīng)的字符。 int getKeyCode():得到按鍵對應(yīng)的掃描碼。 static String getKeyText(int keyCode):將掃描碼轉(zhuǎn)化為說明字符串。 如何處理鍵盤事件:(示例見KeyExample.java) 用按鍵的掃描碼可以準(zhǔn)確的確定按鍵。 KeyEvent類中定義了所有按鍵的掃描碼常量,如:VK_A,VK_SHIFT, VK_F10, VK_ENTER, VK_LEFT, VK_NUMPAD1。 判斷SHIFT,CONTROL,ALT的狀態(tài)可以使用KeyEvent的isShiftDown

16、, isControlDown, isAltDown方法。,JPanel的鍵盤事件,鍵盤事件只在事件源組件獲得輸入焦點時觸發(fā)。 缺省情況下,JPanel因無法得到輸入焦點,所以不能得到鍵盤事件。 解決方法是:使用setFocusable方法,參數(shù)為true,從而使JPanel可以得到輸入焦點,接收鍵盤事件。 注意,窗口中不能同時出現(xiàn)其他能夠獲得輸入焦點的組件。,見KeyExample1.java JPanel testPanel = new JPanel(); testPanel.setFocusable(true);,銷毀鍵盤事件,問題:設(shè)計一個JTextField,用于輸入電話號碼。要求只

17、能輸入數(shù)字,不能輸入其他字符。 解決方法: 用KeyEvent的consume()方法銷毀鍵盤事件,使其不能傳遞到組件。 銷毀鍵盤事件要在鍵盤事件監(jiān)聽器的keyTyped方法中進(jìn)行。,見KeyExample2.java numField.addKeyListener(new KeyAdapter() public void keyTyped(KeyEvent e) char ch = e.getKeyChar(); if(ch 9) e.consume(); );,鼠標(biāo)事件,鼠標(biāo)事件監(jiān)聽器MouseListener有五個方法: void mousePressed(MouseEvent e):對

18、應(yīng)于鼠標(biāo)按鍵按下事件 void mouseReleased(MouseEvent e) :對應(yīng)于鼠標(biāo)按鍵釋放事件 void mouseClicked(MouseEvent e) :結(jié)合上述兩個方法,直接報告鼠標(biāo)點擊事件,用于不須區(qū)分按下或釋放的情況。 void mouseEntered(MouseEvent e) :對應(yīng)于鼠標(biāo)移動進(jìn)入組件 void mouseExited(MouseEvent e) :對應(yīng)于鼠標(biāo)移出組件 鼠標(biāo)事件類MouseEvent的常用方法有: int getButton():得到發(fā)生動作的按鍵(BUTTON1, BUTTON2, BUTTON3)。 int getCli

19、ckCount():得到點擊次數(shù),主要用于雙擊事件。 Point getPoint()(或int getX(),int getY():得到事件發(fā)生時鼠標(biāo)的相對位置。 int getModifiers ():得到鼠標(biāo)按鍵和鍵盤組合鍵的狀態(tài)。 鼠標(biāo)與鍵盤組合使用:(見MouseExample.java) 在鼠標(biāo)事件中判斷SHIFT,CONTROL,ALT的狀態(tài)可以使用MouseEvent的isShiftDown, isControlDown, isAltDown方法。,一般鼠標(biāo)事件的處理,功能:執(zhí)行以下操作,程序就退出: 按住Shift鍵 在testButton左邊50像素之內(nèi)雙擊鼠標(biāo)左鍵 說明

20、因為是雙擊事件,所以最后由鼠標(biāo)點擊事件觸發(fā),對應(yīng)于mouseClicked方法。,見MouseExample.java public void mouseClicked(MouseEvent e) if(e.getButton()=MouseEvent.BUTTON1 ,多個鼠標(biāo)按鍵狀態(tài)的判斷,功能:執(zhí)行以下操作,程序就退出: 按住鼠標(biāo)左鍵和右鍵 按住鍵盤Ctrl鍵 將鼠標(biāo)從testButton移出 說明 因為事件由鼠標(biāo)移出觸發(fā),所以對應(yīng)于mouseExited方法。,見MouseExample.java public void mouseExited(MouseEvent e) /鼠標(biāo)移出t

21、estButton事件 int modifiers = e.getModifiers();/得到鼠標(biāo)當(dāng)前狀態(tài) int exitMask = MouseEvent.BUTTON3_MASK |/鼠標(biāo)右鍵 MouseEvent.CTRL_MASK |/按下鍵盤Ctrl鍵 MouseEvent.BUTTON1_MASK;/鼠標(biāo)左鍵 if(modifiers ,設(shè)置鼠標(biāo)圖標(biāo),功能: 當(dāng)鼠標(biāo)移動到testButton上時,變?yōu)槭中巍?當(dāng)鼠標(biāo)移出testButton后,變?yōu)榧^形狀。 說明:有兩種方法可以完成此功能 1、直接調(diào)用testButton的setCursor方法設(shè)置按鈕的鼠標(biāo)圖標(biāo)。 2、需要同時

22、在mouseEntered和mouseExited方法中設(shè)置窗口的鼠標(biāo)圖標(biāo)。 3、鼠標(biāo)的形狀見Cursor類的文檔。,方法2、見MouseExample.java public void mouseEntered(MouseEvent e) setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); public void mouseExited(MouseEvent e) setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); ,方法1、見MouseExample.java testButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);,鼠標(biāo)移動事件,鼠標(biāo)移動事件監(jiān)聽器MouseMotionListener有兩個方法: void mouseDragged(MouseEvent e):對應(yīng)于鼠標(biāo)的拖動,即鼠標(biāo)在組件上按下,然后移動位置,可以移動出組件之外。 void mouseMoved(MouseEvent e):對應(yīng)于鼠標(biāo)的移動,即沒有按鈕按下,且鼠標(biāo)只在組件內(nèi)部移動位置。 鼠標(biāo)移動事件監(jiān)聽器的入口參數(shù)與MouseList

溫馨提示

  • 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

提交評論