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

下載本文檔

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

文檔簡介

計算機科學(xué)與技術(shù)學(xué)院趙志崑zhaozk@Java程序設(shè)計GUI組件概述awt:AbstractWindowToolkit——抽象窗口工具集從Java1.0中出現(xiàn)。awt處理用戶界面元素的方法是把這些元素的創(chuàng)建和行為委托給每個目標平臺(如windows,Linux)上的本地GUI處理。每個平臺提供的圖形界面元素都不一樣。不同平臺上的awt庫存在不同Bug。awt的事件處理模型在Java1.1版進行了大的改動后,到目前的版本基本沒變。swing:Java2.0中出現(xiàn)。Swing組件全部是由純Java編寫的,用戶界面元素都繪制在空白窗口上,繪制和行為都由swing類自己完成。各平臺之間唯一不同的就是最外層窗口的創(chuàng)建??偨Y(jié):盡管awt的用戶界面組件仍然可以用,但是建議最好不要使用?,F(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)聽器,可以有多個。當事件源產(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)聽器類;在監(jiān)聽器類中實現(xiàn)接口中需要的方法;方法中可以使用ActionEvent對象獲取事件參數(shù);創(chuàng)建一個事件監(jiān)聽器對象;將該對象添加到事件源。見Example1.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassExample1extendsJFrame{publicExample1(){ setSize(320,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ContainercontentPane=getContentPane(); JButtontestButton=newJButton("Test"); testButton.addActionListener(newMyListener1()); contentPane.setLayout(newBorderLayout()); contentPane.add(testButton,BorderLayout.SOUTH);}}classMyListener1implementsActionListener{publicvoidactionPerformed(ActionEvente){ JOptionPane.showMessageDialog(null, "ActionCommand:"+e.getActionCommand());}}事件源與監(jiān)聽器的關(guān)系一個事件源可以對應(yīng)多個監(jiān)聽器。一個監(jiān)聽器可以對應(yīng)多個事件源。classMyListener2implementsActionListener{publicvoidactionPerformed(ActionEvente){ StringactionCommand=e.getActionCommand(); ColorbkColor=null; if(actionCommand.equals("Red"))bkColor=newColor(255,0,0); elseif(actionCommand.equals("Green"))bkColor=newColor(0,255,0); elseif(actionCommand.equals("Blue"))bkColor=Color.blue;

getContentPane().setBackground(bkColor);}}見Example2.javaclassMyListener1implementsActionListener{publicvoidactionPerformed(ActionEvente){ JOptionPane.showMessageDialog(null, "ActionCommand:"+e.getActionCommand());}}myListener2myListener1事件監(jiān)聽機制buttonl1l2publicclassListener1implementsActionListener{ publicvoidactionPerformed(ActionEvente){…}}事件源:當事件發(fā)生時事件源自動調(diào)用監(jiān)聽器列表中各個對象的相應(yīng)方法列表(LinkedList):事件源的addActionListener方法可以將監(jiān)聽器對象添加到列表中監(jiān)聽器對象監(jiān)聽器類interfaceActionListener{ voidactionPerformed(ActionEvente);}監(jiān)聽器接口classActionEvent{

……}事件類事件監(jiān)聽器類的各種寫法監(jiān)聽器類的聲明:將事件監(jiān)聽器作為單獨的類。將事件監(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ū)分不同的事件。publicclassExample1extendsJFrame implementsActionListener{publicvoidactionPerformed(ActionEvente){…}}見Example3.javaredButton.addActionListener(newActionListener(){ //匿名內(nèi)部類監(jiān)聽器 publicvoidactionPerformed(ActionEvente){

…… }});改變觀感改變觀感使用兩個靜態(tài)方法:UIManager.setLookAndFeel(plaf)設(shè)置要使用的觀感參數(shù)plaf為觀感的名字,實際為一個類名,可以為以下字符串:javax.swing.plaf.metal.MetalLookAndFeelcom.sun.java.swing.plaf.windows.WindowsLookAndFeelcom.sun.java.swing.plaf.motif.MotifLookAndFeelSwingUtilities.updateComponentTreeUI(panel)刷新要改變的組件參數(shù)panel給出面板中的一個組件即可刷新整個面板。見Example4.javatButton.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventaEvent){ try{

UIManager.setLookAndFeel(aPlafName);

SwingUtilities.updateComponentTreeUI(Example4.this); }catch(Exceptione){ e.printStackTrace(); };}});窗口事件ActionListener接口非常簡單,用于按鈕事件處理。相應(yīng)的,WindowListener接口用于窗口事件處理。見Example5.javapublicclassExample5extendsJFrame{publicExample5(){

… setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

addWindowListener(newMyWindowListener());}privateclassMyWindowListenerimplementsWindowListener{ publicvoidwindowOpened(WindowEvente){} publicvoidwindowClosing(WindowEvente){ intresult=JOptionPane.showConfirmDialog(……); if(result==JOptionPane.OK_OPTION)System.exit(0); } publicvoidwindowClosed(WindowEvente){} publicvoidwindowIconified(WindowEvente){} publicvoidwindowDeiconified(WindowEvente){} publicvoidwindowActivated(WindowEvente){} publicvoidwindowDeactivated(WindowEvente){}}}添加窗口事件監(jiān)聽器窗口事件監(jiān)聽器實現(xiàn)WindowListener接口要處理的窗口事件適配器類問題:僅僅需要處理關(guān)閉窗口事件,但卻要寫另外六個空方法。解決方法:使用適配器類。適配器類是一個實現(xiàn)了某個接口,但其中所有方法都為空的類。每個具有不止一個方法的監(jiān)聽器接口都對應(yīng)有一個適配器類。編寫監(jiān)聽器類時只需從適配器類派生一個子類即可。見Example6.javaprivateclassMyWindowListenerextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente){ intresult=JOptionPane.showConfirmDialog(……); if(result==JOptionPane.OK_OPTION)System.exit(0); }}由實現(xiàn)接口改為繼承自適配器類,從而不用再寫另外六個無用方法。見Example6.javaaddWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ intresult=JOptionPane.showConfirmDialog(……); if(result==JOptionPane.OK_OPTION)System.exit(0); }});也可寫成匿名內(nèi)部類WindowListenerWindowAdapterMyWindowAdapterJava事件概述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個適配器類java.awt.event包中的11個監(jiān)聽器接口ActionListener WindowListenerAdjustmentListener ComponentListenerContainerListener FocusListenerItemListener KeyListenerMouseListener MouseMotionListenerTextListenerjava.awt.event包中的7個適配器類WindowAdapter ComponenAdapterContainerAdapter FocusAdapterKeyAdapter MouseAdapterMouseMotionAdapterawt事件雖然接口和類比較多,但原理都一樣。定義實現(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:鍵盤上的一個鍵被按下或者釋放MouseEvent:鼠標按鍵的按下和釋放,鼠標移動或拖動FocusEvent:組件得到焦點或失去焦點WindowEvent:窗口被顯示、隱藏、關(guān)閉、激活、圖標化、還原ContainerEvent:容器中加入或移除一個組件鍵盤事件鍵盤事件監(jiān)聽器KeyListener有三個方法:voidkeyPressed(KeyEvente):對應(yīng)于按鍵按下。voidkeyReleased(KeyEvente):對應(yīng)于按鍵彈起。voidkeyTyped(KeyEvente):結(jié)合上述兩個事件,直接報告按了按鍵,用于不須區(qū)分按下和彈起的情況。鍵盤事件類KeyEvent的主要方法有:chargetKeyChar():得到按鍵對應(yīng)的字符。intgetKeyCode():得到按鍵對應(yīng)的掃描碼。staticStringgetKeyText(intkeyCode):將掃描碼轉(zhuǎn)化為說明字符串。如何處理鍵盤事件:(示例見KeyExample.java)用按鍵的掃描碼可以準確的確定按鍵。KeyEvent類中定義了所有按鍵的掃描碼常量,如:VK_A,VK_SHIFT,VK_F10,VK_ENTER,VK_LEFT,VK_NUMPAD1。判斷SHIFT,CONTROL,ALT的狀態(tài)可以使用KeyEvent的isShiftDown,isControlDown,isAltDown方法。JPanel的鍵盤事件鍵盤事件只在事件源組件獲得輸入焦點時觸發(fā)。缺省情況下,JPanel因無法得到輸入焦點,所以不能得到鍵盤事件。解決方法是:使用setFocusable方法,參數(shù)為true,從而使JPanel可以得到輸入焦點,接收鍵盤事件。注意,窗口中不能同時出現(xiàn)其他能夠獲得輸入焦點的組件。見KeyExample1.javaJPaneltestPanel=newJPanel();testPanel.setFocusable(true);銷毀鍵盤事件問題:設(shè)計一個JTextField,用于輸入電話號碼。要求只能輸入數(shù)字,不能輸入其他字符。解決方法:用KeyEvent的consume()方法銷毀鍵盤事件,使其不能傳遞到組件。銷毀鍵盤事件要在鍵盤事件監(jiān)聽器的keyTyped方法中進行。見KeyExample2.javanumField.addKeyListener(newKeyAdapter(){ publicvoidkeyTyped(KeyEvente){ charch=e.getKeyChar(); if(ch<'0'||ch>'9')e.consume(); }});鼠標事件鼠標事件監(jiān)聽器MouseListener有五個方法:voidmousePressed(MouseEvente):對應(yīng)于鼠標按鍵按下事件voidmouseReleased(MouseEvente):對應(yīng)于鼠標按鍵釋放事件voidmouseClicked(MouseEvente):結(jié)合上述兩個方法,直接報告鼠標點擊事件,用于不須區(qū)分按下或釋放的情況。voidmouseEntered(MouseEvente):對應(yīng)于鼠標移動進入組件voidmouseExited(MouseEvente):對應(yīng)于鼠標移出組件鼠標事件類MouseEvent的常用方法有:intgetButton():得到發(fā)生動作的按鍵(BUTTON1,BUTTON2,BUTTON3)。intgetClickCount():得到點擊次數(shù),主要用于雙擊事件。PointgetPoint()(或intgetX(),intgetY()):得到事件發(fā)生時鼠標的相對位置。intgetModifiers():得到鼠標按鍵和鍵盤組合鍵的狀態(tài)。鼠標與鍵盤組合使用:(見MouseExample.java)在鼠標事件中判斷SHIFT,CONTROL,ALT的狀態(tài)可以使用MouseEvent的isShiftDown,isControlDown,isAltDown方法。一般鼠標事件的處理功能:執(zhí)行以下操作,程序就退出:按住Shift鍵在testButton左邊50像素之內(nèi)雙擊鼠標左鍵說明因為是雙擊事件,所以最后由鼠標點擊事件觸發(fā),對應(yīng)于mouseClicked方法。見MouseExample.javapublicvoidmouseClicked(MouseEvente){ if(e.getButton()==MouseEvent.BUTTON1&& //鼠標左鍵

e.getClickCount()==2&& //雙擊

e.getX()<50&& //在testButton左邊50像素

e.isShiftDown()){ //按下鍵盤Shift鍵

System.exit(0); }}多個鼠標按鍵狀態(tài)的判斷功能:執(zhí)行以下操作,程序就退出:按住鼠標左鍵和右鍵按住鍵盤Ctrl鍵將鼠標從testButton移出說明因為事件由鼠標移出觸發(fā),所以對應(yīng)于mouseExited方法。見MouseExample.javapublicvoidmouseExited(MouseEvente){ //鼠標移出testButton事件 intmodifiers=e.getModifiers(); //得到鼠標當前狀態(tài) intexitMask=MouseEvent.BUTTON3_MASK| //鼠標右鍵

MouseEvent.CTRL_MASK| //按下鍵盤Ctrl鍵

MouseEvent.BUTTON1_MASK; //鼠標左鍵

if((modifiers&exitMask)==exitMask){ System.exit(0); }}…1001101modifiers…0000001BUTTON1…0001000CTRL…0000100BUTTON3…0001101exitMask設(shè)置鼠標圖標功能:當鼠標移動到testButton上時,變?yōu)槭中?。當鼠標移出testButton后,變?yōu)榧^形狀。說明:有兩種方法可以完成此功能1、直接調(diào)用testButton的setCursor方法設(shè)置按鈕的鼠標圖標。2、需要同時在mouseEntered和mouseExited方法中設(shè)置窗口的鼠標圖標。3、鼠標的形狀見Cursor類的文檔。方法2、見MouseExample.javapublicvoidmouseEntered(MouseEvente){ setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));}publicvoidmouseExited(MouseEvente){ setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));}方法1、見MouseExample.javatestButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));鼠標移動事件鼠標移動事件監(jiān)聽器MouseMotionListener有兩個方法:voidmouseDragged(MouseEvente):對應(yīng)于鼠標的拖動,即鼠標在組件上按下,然后移動位置,可以移動出組件之外。voidmouseMoved(MouseEvente):對應(yīng)于鼠標的移動,即沒有按鈕按下,且鼠標只在組件內(nèi)部移動位置。鼠標移動事件監(jiān)聽器的入口參數(shù)與MouseListener相同,也是MouseEvent類型。鼠標移動事件的處理:mouseDragged事件通常用于組件內(nèi)部的某些物體形狀、位置等改變。mouseMov

溫馨提示

  • 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

提交評論