2010年6月5日 星期六

Java與Flex區別一:使用自定義事件


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 mypackage
2: {
3: import flash.events.Event;
4:
5: public class ValueChangedEvent extends Event
6: {
7: // event name
8: public static const VALUE_CHANGED:String = "valueChanged";
9: public var value:Number; // customized filed for the event
10:
11: public function ValueChangedEvent(type:String, newValue:Number)
12: {
13: super(type);
14: this.value = newValue
15: }
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 TextArea
3: {
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里面的事件比较一下。

阅读更多。


source:
http://blog.csdn.net/jewes/archive/2010/05/04/5557139.aspx

沒有留言: