Java的事件處理機(jī)制_第1頁
Java的事件處理機(jī)制_第2頁
Java的事件處理機(jī)制_第3頁
Java的事件處理機(jī)制_第4頁
Java的事件處理機(jī)制_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

JavaAWT事件處理機(jī)制

如果用戶在用戶界面層執(zhí)行了一個動作(鼠標(biāo)點擊和按鍵),這將導(dǎo)致一個事件的發(fā)生。事件是描述發(fā)生了什么的對象。存在各種不同類型的事件類用來描述各種類型的用戶交互。事件源是一個事件的產(chǎn)生者。例如,在Button組件上點擊鼠標(biāo)會產(chǎn)生以這個Button為源的一個ActionEvent。這個ActionEvent實例是一個對象,它包含關(guān)于剛才所發(fā)生的那個事件的信息的對象。事件處理器就是一個接收事件、解釋事件并處理用戶交互的方法。

Java語言采用委托事件模型進(jìn)行事件的處理。在這個模型中,已經(jīng)定義好了事件源可能產(chǎn)生的事件類型和與該事件類型相對應(yīng)的接口,它們位于java.awt.event包和javax.swing.event包中。事件監(jiān)聽者是實現(xiàn)與該事件相對應(yīng)的接口的類的對象。例如,對JButton組件進(jìn)行單擊,就產(chǎn)生ActionEvent事件,與ActionEvent事件對應(yīng)的接口為ActionListener。如果用戶定義的一個名叫ButtonHandler的類實現(xiàn)了ActionListener接口的方法(以事件對象為參數(shù)),則ButtonHandler類的一個實例,就可以作為單擊事件的監(jiān)聽者。事件源需要被注冊到監(jiān)聽者才能被監(jiān)測到相對應(yīng)事件的發(fā)生,事件才能被處理。

事件是只向注冊的監(jiān)聽者報告的對象(作為方法的參數(shù))。每個事件都有一個對應(yīng)的監(jiān)聽者接口,規(guī)定哪些方法必須在適合接收那種類型的事件的類中定義。實現(xiàn)了定義那些方法的接口的類可以為一個監(jiān)聽者。事件與事件源

用戶在操作應(yīng)用程序界面中的組件時,就會產(chǎn)生事件(Event),例如單擊一個按鈕,就會產(chǎn)生一個動作事件(ActionEvent);對窗口進(jìn)行縮放或關(guān)閉等操作,就會產(chǎn)生一個窗口事件(WindowEvent);操作了鍵盤就會產(chǎn)生對應(yīng)的鍵盤事件(KeyEvent)。事件源指事件的來源對象,例如單擊一個按鈕時,這個按鈕就是事件源。在Java語言中“一切皆對象”,事件也不例外。當(dāng)事件源產(chǎn)生事件后,與該事件有關(guān)的信息,如事件源、事件類型等就會被系統(tǒng)封裝在一個事件對象中,在處理這個事件的程序中如果需要就可以取出有關(guān)信息。監(jiān)聽器

事件源產(chǎn)生事件后,就要有相應(yīng)的處理者來接收事件對象,并對其進(jìn)行處理。事件的處理者要時刻監(jiān)聽是否有事件產(chǎn)生,如果監(jiān)視到有事件產(chǎn)生,就會自動調(diào)用相應(yīng)的事件處理程序進(jìn)行事件處理,正因為如此,一般把事件的處理者叫事件監(jiān)聽器。事件類型對于每類事件,都有一個接口,這個接口必須由想接收這個事件的類實現(xiàn)。實現(xiàn)接口的類要求實現(xiàn)接口的一個或多個方法,當(dāng)發(fā)生特定的事件時,就會調(diào)用這些方法。表8.4列出了這些(事件)類型,并給出了每個類型對應(yīng)的接口名稱,以及所要求定義的方法。這些方法的名稱是易于記憶的,名稱表示了會引起這個方法被調(diào)用的源或條件。表8.4方法類型和接口

事件類型接口名要實現(xiàn)方法ActionEventActionListeneractionPerformed(ActionEvent)ItemItemListeneritemStateChanged(ItemEvent)MousemotionMouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)MousebuttonMouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)KeyKeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)FocusFocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)AdjustmentAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)WindowWindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)WindowDeiconified(WindowEvent)WindowClosed(WindowEvent)WindowActivated(WindowEvent)WindowDeactivated(WindowEvent)ContainerContainerListenercomponentAdded(ContainerEvent)ComponentRemoved(ContainerEvent)TextTextListenerTextValueChanged(TextEvent)ActionListener接口awt對這個接口的定義是:publicinterfaceActionListenerextendsEventListener{

publicabstractvoidactionPerformed(ActionEvente);}設(shè)計處理事件的類時,就要實現(xiàn)這個接口。其一般形式如下:classClassNameimplementsActionListener{…

…publicvoidactionPerformed(ActionEvente){…}}要創(chuàng)建監(jiān)視器(Classname)的對象,也就是監(jiān)聽者。Classname

對象名=newClassname()

通過實現(xiàn)ActionListener接口,使得監(jiān)視器能知道事件的發(fā)生。在Java中,要求產(chǎn)生事件的事件源向它的監(jiān)視器注冊,這樣,事件源與監(jiān)視器就建立了一個對應(yīng)關(guān)系。建立對應(yīng)關(guān)系的語句如下:對象名.addActionListener(ClassName的對象);其中,對象是事件源,ClassName的對象是監(jiān)視器。

btn.addActionListener(new

ClassName());

這條語句的意思是:按鈕對象(事件源)btn向它的監(jiān)視器注冊,也就是產(chǎn)生事件的事件源對象向監(jiān)視器注冊。事件處理過程(以密碼登錄為例)

本節(jié)將通過一個范例說明事件的處理過程。它將跟蹤鼠標(biāo)被按下時,鼠標(biāo)的移動情況(鼠標(biāo)拖動),還將監(jiān)測當(dāng)鼠標(biāo)沒有按下時,鼠標(biāo)的移動情況(鼠標(biāo)移動)。當(dāng)鼠標(biāo)按下或沒有按下時,移動鼠標(biāo)產(chǎn)生的事件會被實現(xiàn)了MouseMotionListener接口的類的對象檢取。這個接口要求定義兩個方法,mouseDragged()和mouseMoved()。即使你只對鼠標(biāo)拖動感興趣,也必須提供這兩個方法,但是mouseMoved()的體可以是空的。

要檢取其他鼠標(biāo)事件,包括鼠標(biāo)點擊,必須定義MouseListener接口。這個接口包括若干個事件,即mouseEntered、mouseExited、mousePressed、mouseReleased和mouseClicked。發(fā)生鼠標(biāo)或鍵盤事件時,有關(guān)鼠標(biāo)的位置和所按下的鍵的信息可以從事件中得到,代碼如下。例8.25ListenDemo.javaimportjava.awt.*;importjava.awt.event.*;publicclassListenDemo implementsMouseMotionListener,MouseListener{ privateFramef; privateTextFieldtf;publicstaticvoidmain(Stringargs[]) { ListenDemotwo=newListenDemo(); two.go();} publicvoidgo() { f=newFrame("Twolistenersexample"); f.add(newLabel("Clickanddragthemouse"),BorderLayout.NORTH); tf=newTextField(30); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(this); f.addMouseListener(this); f.setSize(300,200);

f.setVisible(true); }publicvoidmouseDragged(MouseEvente) {Strings="Mousedragging:X="+e.getX()+"Y="+e.getY(); tf.setText(s); } publicvoidmouseMoved(MouseEvente){} publicvoidmouseClicked(MouseEvente){} publicvoidmouseEntered(MouseEvente) { Strings="Themouseentered";

tf.setText(s); } publicvoidmouseExited(MouseEvente) { Strings="Themousehasleftthebuilding";tf.setText(s); } publicvoidmousePressed(MouseEvente) {} publicvoidmouseReleased(MouseEvente) {}

}

運行以上程序可看到如圖8.33所示界面。當(dāng)在窗口中拖動鼠標(biāo)時,底端的TextField中將顯示鼠標(biāo)的當(dāng)前位置。圖8.33●定義多了多個接口這個類由代碼:

implementsMouseMotionListener,MouseListener

聲明。聲明多個接口時,可以用逗號隔開?!癖O(jiān)聽多個源如果調(diào)用方法:

f.addMouseListener(this);f.addMouseMotionListener(this);

則兩種類型的事件都會引起ListenDemo類中的方法被調(diào)用。一個對象可以“監(jiān)聽”任意數(shù)量的事件源;它的類只需要實現(xiàn)所要求的接口。事件Adapters(適配器)

一旦指定一個類實現(xiàn)了某個事件監(jiān)聽器接口,就必須實現(xiàn)這個監(jiān)聽器接口的所有方法,否則你只能將你的類定義為抽象類而無法定義這個類的實例。從上面的例子我們可以看到,實現(xiàn)每個Listener接口的所有方法的工作量均是非常大的,尤其是MouseListener接口和ComponentListener接口。以MouseListener接口為例,它定義了如下方法:

①mouseClicked(MouseEvent)②mouseEntered(MouseEvent)③mouseExited(MouseEvent)④mousePressed(MouseEvent)⑤mouseReleased(MouseEvent)

為了方便起見,Java語言提供了Adapters類,用來實現(xiàn)含有多個方法的類。這些Adapters類中的方法是空的。你可以繼承

溫馨提示

  • 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

提交評論