Java開發中的事件驅動模型例項詳解

vjvj110發表於2022-05-10

 或許每個軟體從業者都有從學習控制檯應用程式到學習視覺化程式設計的轉變過程,控制檯應用程式的優點在於可以方便的練習某個語言的語法和開發習慣(如.net和java),而視覺化程式設計的學習又可以非常方便開發出各類人機對話介面(HMI)。視覺化程式設計或許是一個初學者開始對軟體感興趣的開始,也可能是一個軟體學習的里程碑點,因為我們可以使用各類軟體整合開發環境(IDE)方便的在現成的介面視窗上拖放各類元件(Component),這類元件包括我們常見的按鈕(Button),單選按鈕(Radio Button),核取方塊等(Checkbox)。這樣的拖放式開發方式不但方便,而且視窗會立竿見影的顯示在我們的面前,這對於一個軟體初學者而言或許是一件非常有成就感的事情。   但是很多軟體學習者在學習視覺化開發的過程中,只是非常表面的來理解視覺化程式設計,他們可能認為能夠使用拖放方式完成一個介面就非常值得稱道,但是很少有人會認真的去理解程式語言對於視覺化程式設計元件的支援和整合,在Softworks軟體人才培訓中心的兩年教學過程,我深刻的感受到了這一點,因此下文將會結合我的教學經驗來講解視覺化程式設計過程中最為關鍵的“事件驅動模型”。   1.什麼是事件驅動模型?   在講解事件驅動模型之前,我們現在看看事件驅動模型的三大要素:   ·事件源:能夠接收外部事件的源體。   ·偵聽器:能夠接收事件源通知的物件。   ·事件處理程式:用於處理事件的物件。   學員應該要理解任何基於事件驅動模型的開發技術都包含以上三大要素,不管是.net還是java技術,甚至是以前我們使用的Visual Basic和Delphi語言都有基於以上三大要素的事件驅動模型開發流程。   現在我們來看一個生活中的示例,如果有一天你走在路上一不小心被天上掉下來的花瓶砸到了,並且暈死了過去。那麼整個過程其實就是一個事件處理流程,而且我們可以非常方便的分析出剛才所提到的事件驅動模型中的三大要素。   1.被砸暈的這個人其實就是事件源,因為他是能夠接受到外部的事件的源體。   2.偵聽器就是這個人的大腦神經,因為它會感知到疼痛。   3.事件處理就是這個人暈死了過去。   由於事件驅動模型在我們日常生活中是無處不在的,因此Java和其他的程式語言都將這一過程運用到了視覺化程式設計中了。   2.Java程式語言中的事件驅動模型   在Java程式設計技術中,最常用的視覺化程式設計當屬Java Swing技術,Java Swing為開發者提供了很多現成的元件,如:按鈕(JButton),單選按鈕(JRadioButton)等。為了管理使用者與組成程式圖形使用者介面的元件間的互動,必須理解在Java中如何處理事件。   假設使用者單擊了程式圖形使用者介面中的一個按鈕,其實該按鈕就是這個事件的源(可以引發事件的物體)。所有的Java Swing物件都有感知自己被操作的能力,因此JButton按鈕也具有這樣能力。一個事件通常必須有一個源物件,這裡就是JButton物件。當單擊按鈕時,JButton元件類會生成一個用於存放該事件引數的ActionEvent的物件,該物件包含了事件及事件源的資訊。圖1-1顯示了這種機制。      圖 1-1   當JButton感知到自己被點選以後會將這種感覺傳遞給某個偵聽器物件,該偵聽器物件原先已被告知對該類事件感興趣,偵聽器物件僅是一種偵聽特定事件的物件。這裡的“將事件傳遞給偵聽器”僅意味著事件源呼叫偵聽器物件中的一個特定方法,並以事件物件作為實參。偵聽器物件可以偵聽一個特定物件的事件(比如一個按鈕)。   其實可以使任何類的物件成為偵聽器物件,只要使該類實現偵聽器介面。你將會發現有各種各樣的偵聽器介面,以滿足不同型別事件的需要。在這個單擊按鈕的例子中,需要實現ActionListener介面以便接收按鈕事件。在偵聽器介面宣告的方法中,實現了接受這個事件物件並響應該事件的程式碼。在本例中,在事件發生時,呼叫了ActionListener介面中的actionPerformed()方法。每種偵聽器介面都定義了特定的方法,用來接收該偵聽器計劃要處理的事件。   僅僅實現偵聽器介面還不足以將偵聽器物件連線到事件源上,仍需要把偵聽器與希望處理的事件單個源或多個源連線起來。通過呼叫事件源物件的特定方法,可以註冊帶有事件源的偵聽器物件。例如,為了註冊偵聽單擊按鈕事件的偵聽器,需要呼叫JButton物件的addActionListener()方法,該操作可以使偵聽物件和事件源繫結。   每個事件響應時只涉及到對該事件感興趣的偵聽器。由於偵聽器只要求實現一個合適的介面,所以實際上,可以在任何希望的地方接收和處理事件。在Java中使用偵聽器物件處理事件的方式,稱為委託事件模型,這是因為對於諸如按鈕這種元件引起的事件響應,並不是由引起事件的物件本身處理,而是委託獨立的偵聽器物件進行處理,剛才的actionPerformed()其實就是一個委託處理方法。現在讓我們來看一下,JButton是如何將使用者的點選轉化成方法處理的(如圖1-2)。   圖1-2      JButton元件初始化程式碼片斷: private void initialize() { frame = new JFrame(); frame.getContentPane ().setLayout (null); frame.setBounds (100, 100, 247, 165); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle ("事件驅動程式"); //btnPress就是這次點選操作中的事件源 btnPress = new JButton(); btnPress.setText ("Press"); btnPress.setName ("Press"); btnPress.setBounds (63, 98, 99, 23); //向事件源btnPress植入偵聽器物件ButtonEventHandler btnPress.addActionListener (new ButtonEventHandler(this)); frame.getContentPane ().add(btnPress); frame.getContentPane ().add(txtMessage); }   偵聽器建立的程式碼片斷: //偵聽器物件ButtonEventHandler(用來偵聽按鈕的點選操作) class ButtonEventHandler implements ActionListener { //窗體物件 private EventDemo form = null; //通過構造體傳入窗體物件, //作用在於讓偵聽器物件明白事件源處於 //哪個窗體容器中 public ButtonEventHandler(EventDemo form) { this.form = form; } //委託方法 public void actionPerformed(ActionEvent e) { //該方法將會把事件的處理權交給窗體容器類的 //btnPress_Click方法處理。 this.form.btnPress_Click(e); } } 真正的事件處理程式碼片斷: /** * 按鈕btnPress的事件處理方法。 * * @param e 事件引數 */ private void btnPress_Click(ActionEvent e) { String message = "你點選的按鈕名叫:" ((JButton) e.getSource()).getName(); this.txtMessage.setText(message); }   程式碼工作原理:   JButton元件初始化程式碼片斷已經明確闡述了按鈕被建立後放置於窗體上,關鍵在於本程式碼片斷的以下語句:   btnPress.addActionListener(new ButtonEventHandler(this));   該語句就是向事件源植入了偵聽器物件ButtonEventHandler,該類實現了ActionListener結構,因此JButton類的物件btnPress這個時候已經具有了處理使用者點選按鈕的能力了。   當使用者點選btnPress這個按鈕的時候,按鈕物件會直接把這次點選感覺傳遞給ButtonEventHandler的actionPerformed方法處理,為養成較好的程式設計習慣,我們中心並不建議學員直接在該委託方法中編寫程式碼,而是需要將該事件處理再次轉發給窗體中的某個方法來處理,這個方法的命名也必須是有規則的,就是事件源名 下劃線 事件名(btnPress_Click),並且該方法必須具有事件引數ActionEvent,因為在該物件中明確指明瞭,哪個按鈕受到了點選了。e.getSource()方法返回了被點選按鈕的物件,由於這次被點選的是一個按鈕,因此我們需要使用JButton對e.getSource()的返回值進行強轉,隨後通過getName()方法得到這個按鈕的名字。至此整個點選事件處理完了。  查閱關於Java的全部文件    或許每個軟體從業者都有從學習控制檯應用程式到學習視覺化程式設計的轉變過程,控制檯應用程式的優點在於可以方便的練習某個語言的語法和開發習慣(如.net和java),而視覺化程式設計的學習又可以非常方便開發出各類人機對話介面(HMI)。視覺化程式設計或許是一個初學者開始對軟體感興趣的開始,也可能是一個軟體學習的里程碑點,因為我們可以使用各類軟體整合開發環境(IDE)方便的在現成的介面視窗上拖放各類元件(Component),這類元件包括我們常見的按鈕(Button),單選按鈕(Radio Button),核取方塊等(Checkbox)。這樣的拖放式開發方式不但方便,而且視窗會立竿見影的顯示在我們的面前,這對於一個軟體初學者而言或許是一件非常有成就感的事情。   但是很多軟體學習者在學習視覺化開發的過程中,只是非常表面的來理解視覺化程式設計,他們可能認為能夠使用拖放方式完成一個介面就非常值得稱道,但是很少有人會認真的去理解程式語言對於視覺化程式設計元件的支援和整合,在Softworks軟體人才培訓中心的兩年教學過程,我深刻的感受到了這一點,因此下文將會結合我的教學經驗來講解視覺化程式設計過程中最為關鍵的“事件驅動模型”。   1.什麼是事件驅動模型?   在講解事件驅動模型之前,我們現在看看事件驅動模型的三大要素:   ·事件源:能夠接收外部事件的源體。   ·偵聽器:能夠接收事件源通知的物件。   ·事件處理程式:用於處理事件的物件。   學員應該要理解任何基於事件驅動模型的開發技術都包含以上三大要素,不管是.net還是java技術,甚至是以前我們使用的Visual Basic和Delphi語言都有基於以上三大要素的事件驅動模型開發流程。   現在我們來看一個生活中的示例,如果有一天你走在路上一不小心被天上掉下來的花瓶砸到了,並且暈死了過去。那麼整個過程其實就是一個事件處理流程,而且我們可以非常方便的分析出剛才所提到的事件驅動模型中的三大要素。   1.被砸暈的這個人其實就是事件源,因為他是能夠接受到外部的事件的源體。   2.偵聽器就是這個人的大腦神經,因為它會感知到疼痛。   3.事件處理就是這個人暈死了過去。   由於事件驅動模型在我們日常生活中是無處不在的,因此Java和其他的程式語言都將這一過程運用到了視覺化程式設計中了。   2.Java程式語言中的事件驅動模型   在Java程式設計技術中,最常用的視覺化程式設計當屬Java Swing技術,Java Swing為開發者提供了很多現成的元件,如:按鈕(JButton),單選按鈕(JRadioButton)等。為了管理使用者與組成程式圖形使用者介面的元件間的互動,必須理解在Java中如何處理事件。   假設使用者單擊了程式圖形使用者介面中的一個按鈕,其實該按鈕就是這個事件的源(可以引發事件的物體)。所有的Java Swing物件都有感知自己被操作的能力,因此JButton按鈕也具有這樣能力。一個事件通常必須有一個源物件,這裡就是JButton物件。當單擊按鈕時,JButton元件類會生成一個用於存放該事件引數的ActionEvent的物件,該物件包含了事件及事件源的資訊。圖1-1顯示了這種機制。      圖 1-1   當JButton感知到自己被點選以後會將這種感覺傳遞給某個偵聽器物件,該偵聽器物件原先已被告知對該類事件感興趣,偵聽器物件僅是一種偵聽特定事件的物件。這裡的“將事件傳遞給偵聽器”僅意味著事件源呼叫偵聽器物件中的一個特定方法,並以事件物件作為實參。偵聽器物件可以偵聽一個特定物件的事件(比如一個按鈕)。   其實可以使任何類的物件成為偵聽器物件,只要使該類實現偵聽器介面。你將會發現有各種各樣的偵聽器介面,以滿足不同型別事件的需要。在這個單擊按鈕的例子中,需要實現ActionListener介面以便接收按鈕事件。在偵聽器介面宣告的方法中,實現了接受這個事件物件並響應該事件的程式碼。在本例中,在事件發生時,呼叫了ActionListener介面中的actionPerformed()方法。每種偵聽器介面都定義了特定的方法,用來接收該偵聽器計劃要處理的事件。   僅僅實現偵聽器介面還不足以將偵聽器物件連線到事件源上,仍需要把偵聽器與希望處理的事件單個源或多個源連線起來。通過呼叫事件源物件的特定方法,可以註冊帶有事件源的偵聽器物件。例如,為了註冊偵聽單擊按鈕事件的偵聽器,需要呼叫JButton物件的addActionListener()方法,該操作可以使偵聽物件和事件源繫結。   每個事件響應時只涉及到對該事件感興趣的偵聽器。由於偵聽器只要求實現一個合適的介面,所以實際上,可以在任何希望的地方接收和處理事件。在Java中使用偵聽器物件處理事件的方式,稱為委託事件模型,這是因為對於諸如按鈕這種元件引起的事件響應,並不是由引起事件的物件本身處理,而是委託獨立的偵聽器物件進行處理,剛才的actionPerformed()其實就是一個委託處理方法。現在讓我們來看一下,JButton是如何將使用者的點選轉化成方法處理的(如圖1-2)。   圖1-2      JButton元件初始化程式碼片斷: private void initialize() { frame = new JFrame(); frame.getContentPane ().setLayout (null); frame.setBounds (100, 100, 247, 165); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle ("事件驅動程式"); //btnPress就是這次點選操作中的事件源 btnPress = new JButton(); btnPress.setText ("Press"); btnPress.setName ("Press"); btnPress.setBounds (63, 98, 99, 23); //向事件源btnPress植入偵聽器物件ButtonEventHandler btnPress.addActionListener (new ButtonEventHandler(this)); frame.getContentPane ().add(btnPress); frame.getContentPane ().add(txtMessage); }   偵聽器建立的程式碼片斷: //偵聽器物件ButtonEventHandler(用來偵聽按鈕的點選操作) class ButtonEventHandler implements ActionListener { //窗體物件 private EventDemo form = null; //通過構造體傳入窗體物件, //作用在於讓偵聽器物件明白事件源處於 //哪個窗體容器中 public ButtonEventHandler(EventDemo form) { this.form = form; } //委託方法 public void actionPerformed(ActionEvent e) { //該方法將會把事件的處理權交給窗體容器類的 //btnPress_Click方法處理。 this.form.btnPress_Click(e); } } 真正的事件處理程式碼片斷: /** * 按鈕btnPress的事件處理方法。 * * @param e 事件引數 */ private void btnPress_Click(ActionEvent e) { String message = "你點選的按鈕名叫:" ((JButton) e.getSource()).getName(); this.txtMessage.setText(message); }   程式碼工作原理:   JButton元件初始化程式碼片斷已經明確闡述了按鈕被建立後放置於窗體上,關鍵在於本程式碼片斷的以下語句:   btnPress.addActionListener(new ButtonEventHandler(this));   該語句就是向事件源植入了偵聽器物件ButtonEventHandler,該類實現了ActionListener結構,因此JButton類的物件btnPress這個時候已經具有了處理使用者點選按鈕的能力了。   當使用者點選btnPress這個按鈕的時候,按鈕物件會直接把這次點選感覺傳遞給ButtonEventHandler的actionPerformed方法處理,為養成較好的程式設計習慣,我們中心並不建議學員直接在該委託方法中編寫程式碼,而是需要將該事件處理再次轉發給窗體中的某個方法來處理,這個方法的命名也必須是有規則的,就是事件源名 下劃線 事件名(btnPress_Click),並且該方法必須具有事件引數ActionEvent,因為在該物件中明確指明瞭,哪個按鈕受到了點選了。e.getSource()方法返回了被點選按鈕的物件,由於這次被點選的是一個按鈕,因此我們需要使用JButton對e.getSource()的返回值進行強轉,隨後通過getName()方法得到這個按鈕的名字。至此整個點選事件處理完了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31495967/viewspace-2893163/,如需轉載,請註明出處,否則將追究法律責任。

相關文章