




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章鍵盤與鼠標(biāo)事件響應(yīng)
任務(wù)一:掌握事件處理機(jī)制
任務(wù)三:掌握對鼠標(biāo)事件的響應(yīng)方法
任務(wù)二:掌握對鍵盤事件響應(yīng)方法
任務(wù)四:實(shí)訓(xùn)十事件響應(yīng)實(shí)訓(xùn)10.1任務(wù)一掌握事件處理機(jī)制
10.1.1相關(guān)概念1.事件:是一個對象,它描述發(fā)生了什么事情。事件對象由在Java中預(yù)先定義好的類產(chǎn)生,Java定義了所有事件的事件類,如鍵盤操作對應(yīng)的事件類是KeyEvent。java.awt.AWTEvent類是所有事件類的父類。2.事件源:能夠產(chǎn)生事件的對象都可以稱之為事件源,如鍵盤、鼠標(biāo)、按鈕等。3.事件處理方法:能夠接收、解析處理事件類對象,實(shí)現(xiàn)和用戶交互的方法。它以事件對象為參數(shù)。4.監(jiān)視器:對事件源進(jìn)行監(jiān)視,使發(fā)生事件時(shí)做出處理的一種特殊的對象。事件源通過調(diào)用相應(yīng)的方法將某個對象作為自己的監(jiān)視器。10.1.2事件處理機(jī)制Java采用“授權(quán)事件模型”(EventDelegationModel)的事件處理模式。其原理為:事先定義多種事件類型(即用戶在GUI組件上進(jìn)行的操作,如單擊事件),當(dāng)用戶對某個GUI組件進(jìn)行操作時(shí),可能觸發(fā)相應(yīng)的事件,這個組件就是事件源。如果此組件注冊了事件監(jiān)聽器(可以通過addXXXXListener方法注冊),事件被傳送給已注冊的監(jiān)聽器,事件監(jiān)聽器負(fù)責(zé)處理事件的過程。一個組件可以注冊一個或多個監(jiān)聽器。監(jiān)視器負(fù)責(zé)處理事件源發(fā)生的事件。監(jiān)視器是個對象,為了處理事件源發(fā)生的事件,監(jiān)視器會自動調(diào)用一個方法來處理事件。為了讓監(jiān)視器能對事件源發(fā)生的事件進(jìn)行處理,創(chuàng)建該監(jiān)視器的類必須聲明實(shí)現(xiàn)相應(yīng)的接口,即必須在類體中給出該接口中所有方法的方法體,這樣在事件源發(fā)生事件時(shí),監(jiān)視器就自動調(diào)用執(zhí)行被類實(shí)現(xiàn)的某個接口方法
①若要保證一個組件產(chǎn)生的某種類型事件XXXEvent有效,需要注冊一個“事件監(jiān)聽器”監(jiān)聽它。用如下語句設(shè)置事件監(jiān)聽器:事件源.addXXXListener(XXXListener代表某種事件監(jiān)聽器)。②組件作為事件源,不同類型的組件會產(chǎn)生特定類型的事件。③一旦產(chǎn)生事件后,事件會被傳送給已注冊的一個或多個監(jiān)聽器。事件監(jiān)聽器是實(shí)現(xiàn)了與該事件相對應(yīng)的XXXListener接口的類。④事件監(jiān)聽器監(jiān)聽到事件后,會根據(jù)事件的類型調(diào)用相應(yīng)的事件處理方法。事件源產(chǎn)生事件事件1事件2監(jiān)視器1監(jiān)視器2捕獲事件事件處理事件處理圖10-1事件處理模型1.java.awt.event包(1)文本框回車、按鈕單擊、計(jì)時(shí)器、菜單項(xiàng)引發(fā)動作事件:java.awt.event.ActionEvent處理事件的接口:java.awt.event.ActionListener接口中的方法:publicvoidactionPerformed(ActionEventevent)(2)單選按鈕、多選按鈕、下拉列表引發(fā)選項(xiàng)事件:java.awt.event.ItemEvent處理事件的接口:java.awt.event.ItemListener接口中的方法:publicvoiditemStateChanged(ItemEventevent)(3)鍵盤引發(fā)動作事件:java.awt.event.KeyEvent處理事件的接口:java.awt.event.KeyListener(4)鼠標(biāo)引發(fā)鼠標(biāo)事件:java.awt.event.MouseEvent處理事件的接口:java.awt.event.MouseListener與java.awt.event.MouseMotionListener接口。2.java.swing.event包(1)列表(JList)引發(fā)列表選擇事件:java.swing.event.ListSelectionEvent處理事件接口:java.swing.event.ListSelectionListener接口中的方法:publicvoidvalueChanged(ListSelectionEventevent)(2)樹(JTree)引發(fā)樹選擇事件:java.swing.event.TreeSelectionEvent處理事件接口:java.swing.event.TreeSelectionListener接口中的方法:publicvoidvalueChanged(TreeSelectionEventevent)
(3)滑動桿(JSlider)引發(fā)改變事件:java.swing.event.ChangeEvent處理事件接口:java.swing.event.ChangeListener接口中的方法:publicvoidstateChanged(ChangeEventevent)10.2任務(wù)二掌握對鍵盤事件響應(yīng)方法10.2.1鍵盤事件當(dāng)鍵盤按下、釋放、點(diǎn)擊時(shí)都會觸發(fā)鍵盤事件(java.awt.event.KeyEvent),常用的KeyEvent方法是publicintgetKeyCode(),它用于獲取所按下鍵的編碼值。鍵盤事件類提供了很多靜態(tài)常量表示鍵的編碼值,如:VK_A鍵A的編碼值VK_DOWN下箭頭鍵的編碼值VK_UP上箭頭鍵的編碼值VK_1鍵1的編碼值VK_ENTER表示回車編碼值VK_SPACE表示空格鍵編碼值
更多的鍵碼值可以查閱JavaAPI文檔來獲得。編寫鍵盤事件響應(yīng)程序時(shí),使用語句if(e.getKeyCode()==KeyEvent.VK_B)可以判斷是否按下了字母鍵B,然后做相應(yīng)處理,語句中的e是事件處理時(shí)接收的鍵盤事件對象參數(shù)名。10.2.2鍵盤監(jiān)聽接口KeyListener對鍵盤事件可以通過java.awt.event.KeyListener接口中提供的方法來處理。這個接口有三個方法:1.keyPressed(KeyEvente)響應(yīng)按下鍵盤事件;2.keyTyped(KeyEvente)響應(yīng)按下又松開鍵盤事件;3.keyReleased(KeyEvente)響應(yīng)松開鍵盤事件;它們都是publicvoid方法,事件源要使用addKeyListener方法添加監(jiān)視器來獲得事件。【例10-1】對鍵盤事件進(jìn)行響應(yīng)。importjava.awt.event.*;importjavax.swing.*;importjava.awt.*;public
classhhextendsJFrameimplementsKeyListener{ JButtonJButton1; hh(){JPaneljpanel1=newJPanel(); JButton1=newJButton("請按M鍵!"); JButton1.addKeyListener(this);
this.setSize(200,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jpanel1.add(JButton1);
this.add(jpanel1);
this.setVisible(true); }publicvoidkeyPressed(KeyEvente){ if(e.getKeyCode()==KeyEvent.VK_M) {JButton1.setBounds(60,60,90,90); JButton1.setBackground(Color.red); } } publicvoidkeyReleased(KeyEvente){} publicvoidkeyTyped(KeyEvente){} publicstaticvoidmain(Stringargs[]){ newhh(); }}10.2.3鍵盤適配器類KeyAdapter使用KeyListener接口時(shí),即使有些方法不使用也必須在程序中寫出接口的所有方法,因此比較麻煩,而java.awt.event.keyAdapter類本身就使用了KeyListener接口,并對接口的三個方法增加了空方法體,因此使用keyAdapter類時(shí)不必像使用接口那樣實(shí)現(xiàn)所有方法,只需覆蓋要響應(yīng)的鍵盤事件方法即可。下面的程序是通過使用鍵盤適配器類來實(shí)現(xiàn)響應(yīng)鍵盤事件,當(dāng)分別按“R”、“G”、“B”時(shí)將圓的顏色設(shè)置為紅色、綠色和藍(lán)色。【例10-2】importjava.awt.event.*;importjavax.swing.*;importjava.awt.*;publicclasshhextendsJFrame{ Colorc; hh(){ this.setSize(200,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); addKeyListener(newMyType()); } classMyTypeextendsKeyAdapter{publicvoidkeyTyped(KeyEvente){if(e.getKeyChar()=='r'||e.getKeyChar()=='R')c=Color.red;elseif(e.getKeyChar()=='g'||e.getKeyChar()=='G')c=Color.green;elseif(e.getKeyChar()=='b'||e.getKeyChar()=='B')c=Color.blue;elsec=Color.black; repaint();}}publicvoidpaint(Graphicsg){ g.setColor(c); g.fillOval(60,60,100,100); }publicstaticvoidmain(Stringargs[]){ newhh();}}10.3任務(wù)三掌握對鼠標(biāo)事件的響應(yīng)方法
10.3.1鼠標(biāo)事件鼠標(biāo)事件源各種動作可以觸發(fā)鼠標(biāo)事件,如按下鼠標(biāo)、點(diǎn)擊鼠標(biāo)、釋放鼠標(biāo)、鼠標(biāo)進(jìn)入和鼠標(biāo)退出。鼠標(biāo)事件類型是java.awt.event.MouseEvent,當(dāng)發(fā)生鼠標(biāo)事件時(shí)MouseEvent類自動創(chuàng)建一個鼠標(biāo)事件對象。1.MouseEvent類有幾個常用的方法:(1)getX()用于獲取鼠標(biāo)x坐標(biāo)(2)getY()用于獲取鼠標(biāo)y坐標(biāo);(3)getButton()用于獲取鼠標(biāo)的左中右鍵值;根據(jù)鍵值來知道按的是哪一個鍵,MouseEvent.BUTTON1、MouseEvent.BUTTON2和MouseEvent.BUTTON3分別是左中右三個鍵值。例如在程序中通過if(e.getButton()==MouseEvent.BUTTON1)可以判斷按的是否是左鍵。(4)getClickCount()獲取點(diǎn)擊次數(shù);2.添加鼠標(biāo)監(jiān)視器的方法:publicvoidaddMouseListener()。3.移去鼠標(biāo)監(jiān)視器的方法:publicvoidremoveMouseListener().10.3.2使用MouseListener接口處理鼠標(biāo)事件通過使用java.awt.event.MouseListener接口可以對鼠標(biāo)事件進(jìn)行處理,它有以五個方法:(1)mousePressed(MouseEvent)方法,按下鼠標(biāo)時(shí),接口監(jiān)視器發(fā)現(xiàn)這個事件后自動調(diào)用這個方法。(2)mouseReleased(MouseEvent)方法,松開鼠標(biāo)時(shí),接口監(jiān)視器發(fā)現(xiàn)這個事件后自動調(diào)用這個方法。(3)mouseEntered(MouseEvent)方法,鼠標(biāo)指針進(jìn)入容器時(shí),接口監(jiān)視器發(fā)現(xiàn)這個事件后自動調(diào)用這個方法。(4)mouseExited(MouseEvent)方法,鼠標(biāo)指針離開容器時(shí),接口監(jiān)視器發(fā)現(xiàn)這個事件后自動調(diào)用這個方法。(5)mouseClicked(MouseEvent)方法,點(diǎn)擊鼠標(biāo)時(shí),接口監(jiān)視器發(fā)現(xiàn)這個事件后自動調(diào)用這個方法。這五個方法不管鼠標(biāo)按鍵是左中右都會執(zhí)行,如果要根據(jù)不同鍵進(jìn)行不同處理就要先用getButton()方法來判斷。下面通過例10-3來說明如何用MouseListener接口來響應(yīng)鼠標(biāo)事件【例10-3】importjava.awt.*;importjava.applet.*;importjava.awt.event.*;publicclassm1extendsAppletimplementsMouseListener{ TextFieldtext1; intx; publicvoidinit(){x=10; text1=newTextField(40); add(text1); text1.setFont(newFont("隸書",Font.BOLD,20)); addMouseListener(this); } publicvoidmousePressed(MouseEvente){ text1.setText("鼠標(biāo)被按下,重新畫圓!"); repaint();}publicvoidmouseReleased(MouseEvente){ text1.setText("鼠標(biāo)被松開,指針坐標(biāo)是:"+e.getX()+","+e.getY()); } publicvoidmouseEntered(MouseEvente){ text1.setText("鼠標(biāo)進(jìn)入文本框,指針坐標(biāo)是:"+e.getX()+","+e.getY()); } publicvoidmouseExited(MouseEvente){ text1.setText("鼠標(biāo)離開文本框了!"); } publicvoidmouseClicked(MouseEvente){ if(e.getClickCount()==2) {text1.setText("雙擊鼠標(biāo),指針坐標(biāo)是:"+e.getX()+","+e.getY()); } }publicvoidpaint(Graphicsg){ x=x+5; g.setColor(Color.red); g.drawOval(60,60,x,x); g.setColor(Color.blue); g.fillOval(60,60,x,x); } }10.3.3使用MouseMotionListener接口處理鼠標(biāo)事件
MouseListener接口中沒有鼠標(biāo)移動(不按下鼠標(biāo))和拖動(按下鼠標(biāo))的事件處理,對這兩種事件響應(yīng)就要用java.awt.event.MouseMotionListener接口來處理。 它有兩個方法:1)mouseDragged(MouseEvent)處理鼠標(biāo)拖動事件2)mouseMoved(MouseEvent)處理鼠標(biāo)移動事件事件源添加監(jiān)視器方法:publicvoidaddMouseMotionListener()
通過下面的畫畫程序我們了解一下使用MouseMotionListener接口處理鼠標(biāo)事件的方法。【例10-4】importjava.awt.*;importjava.applet.*;importjava.awt.event.*;publicclassm2extendsAppletimplementsMouseMotionListener{ intx=0,y=0; publicvoidinit(){ setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); setBackground(Color.green); addMouseMotionLi
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JS/T 301-2024公共機(jī)構(gòu)能源費(fèi)用托管實(shí)施規(guī)程
- 電子版合同合作協(xié)議書
- 資產(chǎn)規(guī)劃協(xié)議書
- 秘方授權(quán)協(xié)議書
- 股份保留協(xié)議書
- 合伙企業(yè)代持股協(xié)議書
- 經(jīng)營聯(lián)營協(xié)議書
- 比亞迪合作終止協(xié)議書
- 自行辦理協(xié)議書
- 聘用主播協(xié)議書
- mm-pbsa計(jì)算原理結(jié)果
- 國家開放大學(xué)《中文學(xué)科論文寫作》形考任務(wù)1-4參考答案
- 【真題】2023年常州市中考道德與法治試卷(含答案解析)
- 酒吧計(jì)劃創(chuàng)業(yè)計(jì)劃書
- 光伏項(xiàng)目安全培訓(xùn)課件
- 拉森鋼板樁監(jiān)理實(shí)施細(xì)則樣本
- 個人房屋抵押借款合同范本-借款合同
- 中華人民共和國監(jiān)察法學(xué)習(xí)解讀課件
- 中小學(xué)教務(wù)主任培訓(xùn)
- 眼鏡行業(yè)目標(biāo)市場分析
- SFBA102森林消防泵產(chǎn)品結(jié)構(gòu)和使用講座
評論
0/150
提交評論