Java和Flex都支援自定義事件,但是在使用上還是有些差別。
注:本文僅讨論如何在Java和Flex中分别添加一個自定義事件,暫不讨論Flex的事件機制。
Java
在Java中,如果一個類需要釋出自定義事件,通常需要如下步驟:
1. 建立一個自定義Listener的接口,比如
1: public interface IListener {2: public void onValueChange();3: }
2. 在釋出事件的那個類中,提供管理listener的功能,包括,
一個儲存listener的容器,通常使用ArrayList,
添加和移除listener的方法,addListener/removeListener,
内部通知listener的相關代碼
注:當然也可以繼承自java.util.Observable.但是Java不支援多繼承,如果你的類正好需要繼承自另外一個類,那就不行了。個人還是喜歡自己去管理這些listener,這樣addListener/removeListener這些方法的名字可以取的更加具體,以增強可讀性。
3. 在需要處理事件的類實作對應的Listener接口,并将其注冊到釋出事件的類的對象上(通過調用其addListener方法)。
Flex
在Flex中增加一個新的事件,通常需要如下步驟:
1. 建立一個自定義的事件類,該類繼承自flash.events.Event,比如
1: package mypackage2: {3: import flash.events.Event;4:5: public class ValueChangedEvent extends Event6: {7: // event name8: public static const VALUE_CHANGED:String = "valueChanged";9: public var value:Number; // customized filed for the event10:11: public function ValueChangedEvent(type:String, newValue:Number)12: {13: super(type);14: this.value = newValue15: }16:17: override public function clone():Event {18: return new ValueChangedEvent(type, value);19: }20: }21: }
2. 在需要釋出事件的元件裡面,建立一個事件的metadata标簽,這樣Flex Builder就能自動提示該元件支援這個事件。
比如,在action script裡面:
1: [Event(name="valueChange", type="mypackages.ValueChangeEvent")]2: public class MyComponent extends TextArea3: {4: ...5: }6:
在mxml裡面:
1: 2: [Event(name="valueChanged", type="mypackage.ValueChangeEvent")]3: 4:
3. 注冊事件
在MXML裡面處理事件很簡單。如果要把多個對象作為事件的接受者,該怎麼辦呢?在Flex裡面,多數Components都繼承了EventDispatcher,該類提供了管理、通知事件的功能。從這點上看,Flex比Java要友善些。
如果要把一個對象注冊為某個事件的接受者,隻需下面這段代碼:
1: addEventListener(ValueChangedEvent.VALUE_CHANGED,listener);
[注意]上面方法中的listener是一個Function對象。如果你需要myobj裡面的handleValueChanged方法能響應該事件,那麼你需要将myobj.handleValueChanged傳給addEventListener方法,注意handleValueChanged後面沒有"()"。
這是Flex與Java在處理自定義事件上較大的一個的差別:
Java是傳一個對象進去, 該對象必須實作對應的Listener接口;
Flex是傳一個Function對象進去,對方法的名字沒有任何限制,這是Flex的靈活之處。
4. 通知事件
在釋出事件的元件裡面,通過調用如下代碼就能把相應的事件釋出出去:
1: var e:ValueChangedEvent = new ValueChangedEvent(2: ValueChangedEvent.VALUE_CHANGED, newValue);3: dispatchEvent(e);
Flex裡面,建立自定義事件需要兩個參數,一個代表事件類型的String對象,一個是特定于這個事件的資訊(比如這裡的newValue)。
這是Flex與Java在處理自定義事件上另外的一個差別:
Java通知事件時是調用事件接受者上的一個接口方法,
Flex是通過調用dispatchEvent,由Flex的架構來釋出事件。
也許,這裡應該與Swing裡面的事件比較一下。
閱讀更多。