Java之事件驅動模型執行個體詳解

來源:互聯網
上載者:User

或許每個軟體從業者都有從學習控制台應用程式到學習可視化編程的轉變過程,控制台應用程式的優點在於可以方便的練習某個語言的文法和開發習慣(如.net和java),而可視化編程的學習又可以非常方便開發出各類人機對話介面(HMI)。可視化編程或許是一個初學者開始對軟體感興趣的開始,也可能是一個軟體學習的裡程碑點,因為我們可以使用各類軟體整合式開發環境(IDE)方便的在現成的介面視窗上拖放各類組件(Component),這類組件包括我們常見的按鈕(Button),選項按鈕(Radio Button),複選框等(Checkbox)。這樣的拖放式開發方式不但方便,而且視窗會立竿見影的顯示在我們的面前,這對於一個軟體初學者而言或許是一件非常有成就感的事情。

    但是很多軟體學習者在學習可視化開發的過程中,只是非常表面的來理解可視化編程,他們可能認為能夠使用拖放方式完成一個介面就非常值得稱道,但是很少有人會認真的去理解程式設計語言對於可視化編程組件的支援和整合,因此下文將會結合我的教學經驗來講解可視化編程過程中最為關鍵的“事件驅動模型”。

       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的事件處理機制,至於接聽程式和事件來源的內部工作原理,將會在我的下一篇技術文章《Java的觀察者模式》中詳細講解,待續…… 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.