JAVAC.JP
HOSHI TETSUYA 星鉄矢
2005/07/25
hossy@javac.jp
http://www.javac.jp
Google
WWW を検索 WWW.JAVAC.JP を検索

3-3 EventDispatcherの意義と使い方

mx.events.EventDispatcherクラスのメリットは、イベントに関する監視をaddEventListener・removeEventListenerにより、加えたりはずしたりできる点である。クラスに動的にメソッドを追加したり削除したりすることでも、これは実現可能だが、(実際、ActionScript 1.0では汎用的にこの方法を行っていた。)ここではEventDispatcherを用いる方法を説明する。イベントに対してリスナーを付加するという手法の方がC++,Javaなどと比較しても一般的なものであると考えられる。

基本的な使い方は以下のようになる。
import mx.events.EventDispatcher;

class Test{
    var targetMc:MovieClip;

    function Test(path:MovieClip){
        path.createEmptyMovieClip("seed",1);
        targetMc=path.seed;
        EventDispatcher.initialize(targetMc);
        targetMc.onPress=function{
            var lo:Object=new Object();
            lo.target=this;
            lo.type="onPressHandler";
            this.dispatchEvent(lo);
        }
        targetMc.addEventListener("onPressHandler",this);
    }

    function onPressHandler():Void{
        trace("pressd.");
    }
}
まず、import文でmx.events.Dispatcherクラスを読み込む。
リスナーを付加する対象となるオブジェクトをinitializeする。
オブジェクトに対する匿名メソッドを定義する際に、内部でリスナーオブジェクトを作成し、そのリスナーオブジェクトをdispatchEventする。(リスナーオブジェクトにはtarget,typeメンバで呼び出されるメソッドを定義する必要がある。)
呼び出されるメソッドをaddEventListenerで登録する。

EventDispatcherの対象となるオブジェクトだが、ムービークリップだけがその対象ではない。dynamicなクラスであれば、いずれのクラスもその対象となるし、非dynamicなクラスでも、以下のようなクラスは対象となり得る。
class Test{
    var addEventListener:Function;
    var removeEventListener:Function;
    private var dispatchEvent:Function;
}
つまり、クラスがdynamicであることそのものが重要なのではない。EventDispatcher.initializeによりその対象オブジェクトに機能が付加される際、addEventListenerメソッド、removeEventListenerメソッド、dispatchEventメソッドに内容が付加されるため、これらのメソッドをあらかじめ保持させておき、オーバーライドさせれば、initializeは成功する。(dynamicな場合、メソッドの動的な追加は許されるので、これらのメソッドを保持させる必要がなかった。)




BACKTOPNEXT




All Contents Copyright (C) 2005 HOSHI Tetsuya
Home