本文系作者學習資料整理,不足之處請大家指正,謝謝!
本文參考資料:《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方法中使用,所以設計了構造函數來進行初始化和將類本身向組件註冊。
後面我們將使用匿名內部類來代替自定義類,這樣我們省去了給一個自定義類取一個有意義的名字的麻煩。