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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JavaAWT事件處理機制

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

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

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

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

事件源產生事件后,就要有相應的處理者來接收事件對象,并對其進行處理。事件的處理者要時刻監(jiān)聽是否有事件產生,如果監(jiān)視到有事件產生,就會自動調用相應的事件處理程序進行事件處理,正因為如此,一般把事件的處理者叫事件監(jiān)聽器。事件類型對于每類事件,都有一個接口,這個接口必須由想接收這個事件的類實現(xiàn)。實現(xiàn)接口的類要求實現(xiàn)接口的一個或多個方法,當發(fā)生特定的事件時,就會調用這些方法。表8.4列出了這些(事件)類型,并給出了每個類型對應的接口名稱,以及所要求定義的方法。這些方法的名稱是易于記憶的,名稱表示了會引起這個方法被調用的源或條件。表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);}設計處理事件的類時,就要實現(xiàn)這個接口。其一般形式如下:classClassNameimplementsActionListener{…

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

對象名=newClassname()

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

btn.addActionListener(new

ClassName());

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

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

要檢取其他鼠標事件,包括鼠標點擊,必須定義MouseListener接口。這個接口包括若干個事件,即mouseEntered、mouseExited、mousePressed、mouseReleased和mouseClicked。發(fā)生鼠標或鍵盤事件時,有關鼠標的位置和所按下的鍵的信息可以從事件中得到,代碼如下。例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所示界面。當在窗口中拖動鼠標時,底端的TextField中將顯示鼠標的當前位置。圖8.33●定義多了多個接口這個類由代碼:

implementsMouseMotionListener,MouseListener

聲明。聲明多個接口時,可以用逗號隔開。●監(jiān)聽多個源如果調用方法:

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

則兩種類型的事件都會引起ListenDemo類中的方法被調用。一個對象可以“監(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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論