初識事件處理

本文系作者學習資料整理,不足之處請大家指正,謝謝!

本文參考資料:《java se6 全方位學習》 朱仲傑編著  機械工業出版社

 

java事件處理架構

一個java事件包含三部分1.事件本身    2.事件來源    3.誰來處理

以點擊窗口的右上角的叉來說,點擊叉是事件本身,而窗口則是事件的來源,選擇誰來處理需要我們自己設定,也就是一個操作,一個組件,還有一個方法。只不過這個方法是一個自定義的新類的方法。

 

java的委託事件模式(Delegation Event Model)

這種模式就是來處理用誰來處理事件的。我們委託某個類來處理事件時,那麼這個類需要繼承相應的事件類或實現相應的事件接口,如xxxAdapter,xxxListener。並且需要將這個類向組件註冊,否則在組件上發生的事件不會傳到自定義類的方法中去處理。例子1如下:

import java.awt.*;

import java.awt.event.*; 

public class  WindowEventTest{

public static void main(String[ ]  args)

{

   Frame f = new Frame( "WindowEventTest");

   f.setSize(600,400);

   f.setVisible(true);

   f.addWindowListener(new WindowEventHandler);

  //將自定義類WindowEventHandler註冊到組件(即由Frame類生成的一個對象f)

 // 對於不同的事件,需要不同的addxxxListener方法。

}

} 

// 自定義類WindowEventHandler

// class WindowEventHandler  implements WindowListener

// 我們不選實現接口(WindowListener),而選擇繼承類(WindowAdapter),原因在於實現接口要實

//  現接口裏的所以方法,而WindowAdapter類已經爲我們實現接口WindowListener中所有方法,

//  當然都是空實現,我們要做的只是重寫我們需要的方法。

class WindowEventHandler  extends WindowAdapter

{

   public void windowClosing(WindowEvent e)

{

     System.exit(0);    // 表示當點擊窗口右上角的叉時,關閉窗口,退出程序

}

}

 

注:在上面的例子中,我們列出了事件處理的基本內容:

我們需要一個事件來源,即一個Frame對象;事件本身是點擊窗口右上角的叉;如何處理,即我們委託自定義類來處理,當然這個自定義類需要繼承相應的事件類(xxxAdapter),或實現相應的接口(xxxListener); 

例子2:

當然我們可以調用public 這個類,也就是類WindowEventTest2來當做事件的處理者,這樣的話我們需要將自己(也就是public這個類)註冊組件中,形如f.addWindowListener(this);  上面程序可以改寫爲:

import java.awt.*;

import java.awt.event.*; 

public class  WindowEventTest2  extends WindowAdapter{ //本身這個類要繼承或實現

Frame f ;        // 將Frame 對象f 作爲 public類的屬性,那麼public類中的所有方法都可以調用。

public static void main(String[ ]  args)

{

   new WindowEventTest2( );      //  生成一個WindowEventTest對象

 }

public WindowEventTest2( )      // 構造函數,在它內部進行初始化

{

   f = new Frame("WindowEventTest2");

   f.addWindowListener(this);    //委託WindowEventTest2,也就是自己本身,所以用this

   f.setSize(600,400);

   f.setVisible(true);

}

   public void windowClosing(WindowEvent e)

{

     System.exit(0);    // 表示當點擊窗口右上角的叉時,關閉窗口,退出程序

}

}

注:

1.我們需要使public類繼承Adapter類或實現Listener接口,當然可以實現多個接口用來處理不同的事件。

2.因爲this不能用在static方法中,所以不能在main方法中使用,所以設計了構造函數來進行初始化和將類本身向組件註冊。

 

後面我們將使用匿名內部類來代替自定義類,這樣我們省去了給一個自定義類取一個有意義的名字的麻煩。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章