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

下載本文檔

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

文檔簡(jiǎn)介

計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院趙志崑zhaozk@Java程序設(shè)計(jì)GUI組件概述awt:AbstractWindowToolkit——抽象窗口工具集從Java1.0中出現(xiàn)。awt處理用戶界面元素的方法是把這些元素的創(chuàng)建和行為委托給每個(gè)目標(biāo)平臺(tái)(如windows,Linux)上的本地GUI處理。每個(gè)平臺(tái)提供的圖形界面元素都不一樣。不同平臺(tái)上的awt庫(kù)存在不同Bug。awt的事件處理模型在Java1.1版進(jìn)行了大的改動(dòng)后,到目前的版本基本沒變。swing:Java2.0中出現(xiàn)。Swing組件全部是由純Java編寫的,用戶界面元素都繪制在空白窗口上,繪制和行為都由swing類自己完成。各平臺(tái)之間唯一不同的就是最外層窗口的創(chuàng)建??偨Y(jié):盡管awt的用戶界面組件仍然可以用,但是建議最好不要使用?,F(xiàn)在編寫Java圖形界面程序,使用swing組件+awt事件處理模型。事件處理概述圖形用戶界面編程中,必須使用事件處理。程序的執(zhí)行不是一條連續(xù)的線,而是很多獨(dú)立的片段。支持GUI的操作環(huán)境會(huì)不斷監(jiān)視事件,并把事件報(bào)告給正在運(yùn)行的程序。這是多任務(wù)的需要。每個(gè)程序自己決定如何響應(yīng)這些事件。Java的事件處理采用的是事件監(jiān)聽器方式。事件監(jiān)聽器是一個(gè)實(shí)現(xiàn)了監(jiān)聽器接口的對(duì)象。事件源(如按鈕組件)是一個(gè)能夠注冊(cè)監(jiān)聽器并為它們發(fā)送事件的對(duì)象(可視構(gòu)件)。每個(gè)事件源擁有自己的事件監(jiān)聽器,可以有多個(gè)。當(dāng)事件源產(chǎn)生了一個(gè)事件后,事件源就會(huì)給所有監(jiān)聽器對(duì)象發(fā)送通知,即調(diào)用事件監(jiān)聽器對(duì)象的相應(yīng)方法。事件的信息被封裝在一個(gè)對(duì)象中,不同事件源能夠產(chǎn)生不同種類的事件。編程人員要做的就是編寫事件監(jiān)聽器類,創(chuàng)建一個(gè)事件監(jiān)聽器對(duì)象,并添加到相應(yīng)的事件源。事件源事件監(jiān)聽器事件事件監(jiān)聽器編寫編寫事件處理程序的步驟如下:編寫監(jiān)聽器類;在監(jiān)聽器類中實(shí)現(xiàn)接口中需要的方法;方法中可以使用ActionEvent對(duì)象獲取事件參數(shù);創(chuàng)建一個(gè)事件監(jiān)聽器對(duì)象;將該對(duì)象添加到事件源。見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)系一個(gè)事件源可以對(duì)應(yīng)多個(gè)監(jiān)聽器。一個(gè)監(jiān)聽器可以對(duì)應(yīng)多個(gè)事件源。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)聽機(jī)制buttonl1l2publicclassListener1implementsActionListener{ publicvoidactionPerformed(ActionEvente){…}}事件源:當(dāng)事件發(fā)生時(shí)事件源自動(dòng)調(diào)用監(jiān)聽器列表中各個(gè)對(duì)象的相應(yīng)方法列表(LinkedList):事件源的addActionListener方法可以將監(jiān)聽器對(duì)象添加到列表中監(jiān)聽器對(duì)象監(jiān)聽器類interfaceActionListener{ voidactionPerformed(ActionEvente);}監(jiān)聽器接口classActionEvent{

……}事件類事件監(jiān)聽器類的各種寫法監(jiān)聽器類的聲明:將事件監(jiān)聽器作為單獨(dú)的類。將事件監(jiān)聽器作為組件的內(nèi)部類。直接使用已有類(通常是包含事件源的組件)作為事件監(jiān)聽器。使用匿名內(nèi)部類。監(jiān)聽器類的實(shí)現(xiàn):一個(gè)監(jiān)聽器類實(shí)現(xiàn)多個(gè)組件的監(jiān)聽器對(duì)象。通過類中的實(shí)例字段來(lái)區(qū)分不同的監(jiān)聽器對(duì)象。一個(gè)監(jiān)聽器對(duì)象作為多個(gè)組件的監(jiān)聽器。在事件的響應(yīng)方法中通過事件源區(qū)分不同的事件。publicclassExample1extendsJFrame implementsActionListener{publicvoidactionPerformed(ActionEvente){…}}見Example3.javaredButton.addActionListener(newActionListener(){ //匿名內(nèi)部類監(jiān)聽器 publicvoidactionPerformed(ActionEvente){

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

publicvoidactionPerformed(ActionEventaEvent){ try{

UIManager.setLookAndFeel(aPlafName);

SwingUtilities.updateComponentTreeUI(Example4.this); }catch(Exceptione){ e.printStackTrace(); };}});窗口事件ActionListener接口非常簡(jiǎn)單,用于按鈕事件處理。相應(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)聽器實(shí)現(xiàn)WindowListener接口要處理的窗口事件適配器類問題:僅僅需要處理關(guān)閉窗口事件,但卻要寫另外六個(gè)空方法。解決方法:使用適配器類。適配器類是一個(gè)實(shí)現(xiàn)了某個(gè)接口,但其中所有方法都為空的類。每個(gè)具有不止一個(gè)方法的監(jiān)聽器接口都對(duì)應(yīng)有一個(gè)適配器類。編寫監(jiān)聽器類時(shí)只需從適配器類派生一個(gè)子類即可。見Example6.javaprivateclassMyWindowListenerextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente){ intresult=JOptionPane.showConfirmDialog(……); if(result==JOptionPane.OK_OPTION)System.exit(0); }}由實(shí)現(xiàn)接口改為繼承自適配器類,從而不用再寫另外六個(gè)無(wú)用方法。見Example6.javaaddWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ intresult=JOptionPane.showConfirmDialog(……); if(result==JOptionPane.OK_OPTION)System.exit(0); }});也可寫成匿名內(nèi)部類WindowListenerWindowAdapterMyWindowAdapterJava事件概述Java中所有事件都從java.util.EventObject類繼承而來(lái)。兩個(gè)包中定義了事件:java.awt.event:awt的事件、監(jiān)聽器及適配器定義。java.swing.event:專門用于swing組件的附加事件。如何查找組件能夠產(chǎn)生哪些事件:查找組件能夠添加哪些事件監(jiān)聽器(add***Listener)根據(jù)該方法的參數(shù)查找相應(yīng)的接口,即可知道具體的事件含義java.awt.event包中定義了11個(gè)監(jiān)聽器接口、7個(gè)適配器類java.awt.event包中的11個(gè)監(jiān)聽器接口ActionListener WindowListenerAdjustmentListener ComponentListenerContainerListener FocusListenerItemListener KeyListenerMouseListener MouseMotionListenerTextListenerjava.awt.event包中的7個(gè)適配器類WindowAdapter ComponenAdapterContainerAdapter FocusAdapterKeyAdapter MouseAdapterMouseMotionAdapterawt事件雖然接口和類比較多,但原理都一樣。定義實(shí)現(xiàn)監(jiān)聽器接口的監(jiān)聽器類,在相應(yīng)方法中添加事件處理代碼。創(chuàng)建一個(gè)監(jiān)聽器類的對(duì)象,添加到事件源的監(jiān)聽器列表中。awt事件分為語(yǔ)義事件和低級(jí)事件。語(yǔ)義事件是有明確意義的事件。ActionEvent:按鈕按下、菜單選擇、選擇列表項(xiàng)、文本域中按回車AdjustmentEvent:調(diào)整滾動(dòng)條ItemEvent:從一組選擇框或列表項(xiàng)中選擇一個(gè)TextEvent:文本域或文本框中內(nèi)容發(fā)生變化低級(jí)事件是較小的基本事件。ComponentEvent:組件被顯示、隱藏、改變位置、改變大小KeyEvent:鍵盤上的一個(gè)鍵被按下或者釋放MouseEvent:鼠標(biāo)按鍵的按下和釋放,鼠標(biāo)移動(dòng)或拖動(dòng)FocusEvent:組件得到焦點(diǎn)或失去焦點(diǎn)WindowEvent:窗口被顯示、隱藏、關(guān)閉、激活、圖標(biāo)化、還原ContainerEvent:容器中加入或移除一個(gè)組件鍵盤事件鍵盤事件監(jiān)聽器KeyListener有三個(gè)方法:voidkeyPressed(KeyEvente):對(duì)應(yīng)于按鍵按下。voidkeyReleased(KeyEvente):對(duì)應(yīng)于按鍵彈起。voidkeyTyped(KeyEvente):結(jié)合上述兩個(gè)事件,直接報(bào)告按了按鍵,用于不須區(qū)分按下和彈起的情況。鍵盤事件類KeyEvent的主要方法有:chargetKeyChar():得到按鍵對(duì)應(yīng)的字符。intgetKeyCode():得到按鍵對(duì)應(yīng)的掃描碼。staticStringgetKeyText(intkeyCode):將掃描碼轉(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,isControlDown,isAltDown方法。JPanel的鍵盤事件鍵盤事件只在事件源組件獲得輸入焦點(diǎn)時(shí)觸發(fā)。缺省情況下,JPanel因無(wú)法得到輸入焦點(diǎn),所以不能得到鍵盤事件。解決方法是:使用setFocusable方法,參數(shù)為true,從而使JPanel可以得到輸入焦點(diǎn),接收鍵盤事件。注意,窗口中不能同時(shí)出現(xiàn)其他能夠獲得輸入焦點(diǎn)的組件。見KeyExample1.javaJPaneltestPanel=newJPanel();testPanel.setFocusable(true);銷毀鍵盤事件問題:設(shè)計(jì)一個(gè)JTextField,用于輸入電話號(hào)碼。要求只能輸入數(shù)字,不能輸入其他字符。解決方法:用KeyEvent的consume()方法銷毀鍵盤事件,使其不能傳遞到組件。銷毀鍵盤事件要在鍵盤事件監(jiān)聽器的keyTyped方法中進(jìn)行。見KeyExample2.javanumField.addKeyListener(newKeyAdapter(){ publicvoidkeyTyped(KeyEvente){ charch=e.getKeyChar(); if(ch<'0'||ch>'9')e.consume(); }});鼠標(biāo)事件鼠標(biāo)事件監(jiān)聽器MouseListener有五個(gè)方法:voidmousePressed(MouseEvente):對(duì)應(yīng)于鼠標(biāo)按鍵按下事件voidmouseReleased(MouseEvente):對(duì)應(yīng)于鼠標(biāo)按鍵釋放事件voidmouseClicked(MouseEvente):結(jié)合上述兩個(gè)方法,直接報(bào)告鼠標(biāo)點(diǎn)擊事件,用于不須區(qū)分按下或釋放的情況。voidmouseEntered(MouseEvente):對(duì)應(yīng)于鼠標(biāo)移動(dòng)進(jìn)入組件voidmouseExited(MouseEvente):對(duì)應(yīng)于鼠標(biāo)移出組件鼠標(biāo)事件類MouseEvent的常用方法有:intgetButton():得到發(fā)生動(dòng)作的按鍵(BUTTON1,BUTTON2,BUTTON3)。intgetClickCount():得到點(diǎn)擊次數(shù),主要用于雙擊事件。PointgetPoint()(或intgetX(),intgetY()):得到事件發(fā)生時(shí)鼠標(biāo)的相對(duì)位置。intgetModifiers():得到鼠標(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)左鍵說明因?yàn)槭请p擊事件,所以最后由鼠標(biāo)點(diǎn)擊事件觸發(fā),對(duì)應(yīng)于mouseClicked方法。見MouseExample.javapublicvoidmouseClicked(MouseEvente){ if(e.getButton()==MouseEvent.BUTTON1&& //鼠標(biāo)左鍵

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

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

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

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

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

MouseEvent.BUTTON1_MASK; //鼠標(biāo)左鍵

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論