版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章鍵盤與鼠標(biāo)事件響應(yīng)
任務(wù)一:掌握事件處理機(jī)制
任務(wù)三:掌握對(duì)鼠標(biāo)事件的響應(yīng)方法
任務(wù)二:掌握對(duì)鍵盤事件響應(yīng)方法
任務(wù)四:實(shí)訓(xùn)十事件響應(yīng)實(shí)訓(xùn)10.1任務(wù)一掌握事件處理機(jī)制
10.1.1相關(guān)概念1.事件:是一個(gè)對(duì)象,它描述發(fā)生了什么事情。事件對(duì)象由在Java中預(yù)先定義好的類產(chǎn)生,Java定義了所有事件的事件類,如鍵盤操作對(duì)應(yīng)的事件類是KeyEvent。java.awt.AWTEvent類是所有事件類的父類。2.事件源:能夠產(chǎn)生事件的對(duì)象都可以稱之為事件源,如鍵盤、鼠標(biāo)、按鈕等。3.事件處理方法:能夠接收、解析處理事件類對(duì)象,實(shí)現(xiàn)和用戶交互的方法。它以事件對(duì)象為參數(shù)。4.監(jiān)視器:對(duì)事件源進(jìn)行監(jiān)視,使發(fā)生事件時(shí)做出處理的一種特殊的對(duì)象。事件源通過(guò)調(diào)用相應(yīng)的方法將某個(gè)對(duì)象作為自己的監(jiān)視器。10.1.2事件處理機(jī)制Java采用“授權(quán)事件模型”(EventDelegationModel)的事件處理模式。其原理為:事先定義多種事件類型(即用戶在GUI組件上進(jìn)行的操作,如單擊事件),當(dāng)用戶對(duì)某個(gè)GUI組件進(jìn)行操作時(shí),可能觸發(fā)相應(yīng)的事件,這個(gè)組件就是事件源。如果此組件注冊(cè)了事件監(jiān)聽(tīng)器(可以通過(guò)addXXXXListener方法注冊(cè)),事件被傳送給已注冊(cè)的監(jiān)聽(tīng)器,事件監(jiān)聽(tīng)器負(fù)責(zé)處理事件的過(guò)程。一個(gè)組件可以注冊(cè)一個(gè)或多個(gè)監(jiān)聽(tīng)器。監(jiān)視器負(fù)責(zé)處理事件源發(fā)生的事件。監(jiān)視器是個(gè)對(duì)象,為了處理事件源發(fā)生的事件,監(jiān)視器會(huì)自動(dòng)調(diào)用一個(gè)方法來(lái)處理事件。為了讓監(jiān)視器能對(duì)事件源發(fā)生的事件進(jìn)行處理,創(chuàng)建該監(jiān)視器的類必須聲明實(shí)現(xiàn)相應(yīng)的接口,即必須在類體中給出該接口中所有方法的方法體,這樣在事件源發(fā)生事件時(shí),監(jiān)視器就自動(dòng)調(diào)用執(zhí)行被類實(shí)現(xiàn)的某個(gè)接口方法
①若要保證一個(gè)組件產(chǎn)生的某種類型事件XXXEvent有效,需要注冊(cè)一個(gè)“事件監(jiān)聽(tīng)器”監(jiān)聽(tīng)它。用如下語(yǔ)句設(shè)置事件監(jiān)聽(tīng)器:事件源.addXXXListener(XXXListener代表某種事件監(jiān)聽(tīng)器)。②組件作為事件源,不同類型的組件會(huì)產(chǎn)生特定類型的事件。③一旦產(chǎn)生事件后,事件會(huì)被傳送給已注冊(cè)的一個(gè)或多個(gè)監(jiān)聽(tīng)器。事件監(jiān)聽(tīng)器是實(shí)現(xiàn)了與該事件相對(duì)應(yīng)的XXXListener接口的類。④事件監(jiān)聽(tīng)器監(jiān)聽(tīng)到事件后,會(huì)根據(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ā)動(dòng)作事件: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ā)動(dòng)作事件: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)樹(shù)(JTree)引發(fā)樹(shù)選擇事件:java.swing.event.TreeSelectionEvent處理事件接口:java.swing.event.TreeSelectionListener接口中的方法:publicvoidvalueChanged(TreeSelectionEventevent)
(3)滑動(dòng)桿(JSlider)引發(fā)改變事件:java.swing.event.ChangeEvent處理事件接口:java.swing.event.ChangeListener接口中的方法:publicvoidstateChanged(ChangeEventevent)10.2任務(wù)二掌握對(duì)鍵盤事件響應(yīng)方法10.2.1鍵盤事件當(dāng)鍵盤按下、釋放、點(diǎn)擊時(shí)都會(huì)觸發(fā)鍵盤事件(java.awt.event.KeyEvent),常用的KeyEvent方法是publicintgetKeyCode(),它用于獲取所按下鍵的編碼值。鍵盤事件類提供了很多靜態(tài)常量表示鍵的編碼值,如:VK_A鍵A的編碼值VK_DOWN下箭頭鍵的編碼值VK_UP上箭頭鍵的編碼值VK_1鍵1的編碼值VK_ENTER表示回車編碼值VK_SPACE表示空格鍵編碼值
更多的鍵碼值可以查閱JavaAPI文檔來(lái)獲得。編寫鍵盤事件響應(yīng)程序時(shí),使用語(yǔ)句if(e.getKeyCode()==KeyEvent.VK_B)可以判斷是否按下了字母鍵B,然后做相應(yīng)處理,語(yǔ)句中的e是事件處理時(shí)接收的鍵盤事件對(duì)象參數(shù)名。10.2.2鍵盤監(jiān)聽(tīng)接口KeyListener對(duì)鍵盤事件可以通過(guò)java.awt.event.KeyListener接口中提供的方法來(lái)處理。這個(gè)接口有三個(gè)方法:1.keyPressed(KeyEvente)響應(yīng)按下鍵盤事件;2.keyTyped(KeyEvente)響應(yīng)按下又松開(kāi)鍵盤事件;3.keyReleased(KeyEvente)響應(yīng)松開(kāi)鍵盤事件;它們都是publicvoid方法,事件源要使用addKeyListener方法添加監(jiān)視器來(lái)獲得事件?!纠?0-1】對(duì)鍵盤事件進(jìn)行響應(yīng)。importjava.awt.event.*;importjavax.swing.*;importjava.awt.*;public
classhhextendsJFrameimplementsKeyListener{ JButtonJButton1; hh(){JPaneljpanel1=newJPanel(); JButton1=newJButton("請(qǐng)按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接口,并對(duì)接口的三個(gè)方法增加了空方法體,因此使用keyAdapter類時(shí)不必像使用接口那樣實(shí)現(xiàn)所有方法,只需覆蓋要響應(yīng)的鍵盤事件方法即可。下面的程序是通過(guò)使用鍵盤適配器類來(lái)實(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ù)三掌握對(duì)鼠標(biāo)事件的響應(yīng)方法
10.3.1鼠標(biāo)事件鼠標(biāo)事件源各種動(dòng)作可以觸發(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類自動(dòng)創(chuàng)建一個(gè)鼠標(biāo)事件對(duì)象。1.MouseEvent類有幾個(gè)常用的方法:(1)getX()用于獲取鼠標(biāo)x坐標(biāo)(2)getY()用于獲取鼠標(biāo)y坐標(biāo);(3)getButton()用于獲取鼠標(biāo)的左中右鍵值;根據(jù)鍵值來(lái)知道按的是哪一個(gè)鍵,MouseEvent.BUTTON1、MouseEvent.BUTTON2和MouseEvent.BUTTON3分別是左中右三個(gè)鍵值。例如在程序中通過(guò)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)事件通過(guò)使用java.awt.event.MouseListener接口可以對(duì)鼠標(biāo)事件進(jìn)行處理,它有以五個(gè)方法:(1)mousePressed(MouseEvent)方法,按下鼠標(biāo)時(shí),接口監(jiān)視器發(fā)現(xiàn)這個(gè)事件后自動(dòng)調(diào)用這個(gè)方法。(2)mouseReleased(MouseEvent)方法,松開(kāi)鼠標(biāo)時(shí),接口監(jiān)視器發(fā)現(xiàn)這個(gè)事件后自動(dòng)調(diào)用這個(gè)方法。(3)mouseEntered(MouseEvent)方法,鼠標(biāo)指針進(jìn)入容器時(shí),接口監(jiān)視器發(fā)現(xiàn)這個(gè)事件后自動(dòng)調(diào)用這個(gè)方法。(4)mouseExited(MouseEvent)方法,鼠標(biāo)指針離開(kāi)容器時(shí),接口監(jiān)視器發(fā)現(xiàn)這個(gè)事件后自動(dòng)調(diào)用這個(gè)方法。(5)mouseClicked(MouseEvent)方法,點(diǎn)擊鼠標(biāo)時(shí),接口監(jiān)視器發(fā)現(xiàn)這個(gè)事件后自動(dòng)調(diào)用這個(gè)方法。這五個(gè)方法不管鼠標(biāo)按鍵是左中右都會(huì)執(zhí)行,如果要根據(jù)不同鍵進(jìn)行不同處理就要先用getButton()方法來(lái)判斷。下面通過(guò)例10-3來(lái)說(shuō)明如何用MouseListener接口來(lái)響應(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)被松開(kāi),指針坐標(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)離開(kāi)文本框了!"); } 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接口中沒(méi)有鼠標(biāo)移動(dòng)(不按下鼠標(biāo))和拖動(dòng)(按下鼠標(biāo))的事件處理,對(duì)這兩種事件響應(yīng)就要用java.awt.event.MouseMotionListener接口來(lái)處理。 它有兩個(gè)方法:1)mouseDragged(MouseEvent)處理鼠標(biāo)拖動(dòng)事件2)mouseMoved(MouseEvent)處理鼠標(biāo)移動(dòng)事件事件源添加監(jiān)視器方法:publicvoidaddMouseMotionListener()
通過(guò)下面的畫畫程序我們了解一下使用MouseMotionListener接口處理鼠標(biāo)事件的方法?!纠?0-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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州大學(xué)《行政監(jiān)督學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴州財(cái)經(jīng)大學(xué)《生物制藥綜合實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴陽(yáng)學(xué)院《裝飾材料構(gòu)造與人體工程學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025江西建筑安全員C證考試(專職安全員)題庫(kù)附答案
- 2025青海建筑安全員B證考試題庫(kù)及答案
- 2025年四川建筑安全員C證考試題庫(kù)
- 貴陽(yáng)信息科技學(xué)院《機(jī)械原理(實(shí)驗(yàn))》2023-2024學(xué)年第一學(xué)期期末試卷
- 硅湖職業(yè)技術(shù)學(xué)院《工業(yè)發(fā)酵分析》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025貴州省建筑安全員《A證》考試題庫(kù)
- 廣州新華學(xué)院《實(shí)驗(yàn)設(shè)計(jì)與數(shù)據(jù)處理》2023-2024學(xué)年第一學(xué)期期末試卷
- 《中國(guó)近現(xiàn)代史綱要(2023版)》課后習(xí)題答案合集匯編
- 家庭管理量表(FaMM)
- 腰椎間盤突出癥的射頻治療
- 2023屆河南省洛陽(yáng)市平頂山市許昌市濟(jì)源市高三一模語(yǔ)文試題
- 【超星爾雅學(xué)習(xí)通】《老子》《論語(yǔ)》今讀網(wǎng)課章節(jié)答案
- 配電箱采購(gòu)技術(shù)要求
- 上海外國(guó)語(yǔ)大學(xué)附屬外國(guó)語(yǔ)學(xué)校2020-2021七年級(jí)下學(xué)期期中英語(yǔ)試卷+答案
- 綠色施工措施措施 四節(jié)一環(huán)保
- TCSES 71-2022 二氧化碳地質(zhì)利用與封存項(xiàng)目泄漏風(fēng)險(xiǎn)評(píng)價(jià)規(guī)范
- GB/T 8561-2001專業(yè)技術(shù)職務(wù)代碼
- GB/T 7661-2009光學(xué)零件氣泡度
評(píng)論
0/150
提交評(píng)論