手動によるイベントの送出

コンポーネントインスタンスの dispatchEvent() メソッドを使用すると、イベントを手動で送出できます。このメソッドは、UIComponent を拡張するすべてのコンポーネントに含まれます。このメソッドは、UIComponent の拡張元の EventDispatcher クラスから継承されています。

dispatchEvent() メソッドのシンタックスは次のとおりです。

objectInstance.dispatchEvent(event:Event):Boolean

イベントの送出時には、新しい Event オブジェクトを作成する必要があります。Event オブジェクトコンストラクタのシンタックスは次のとおりです。

Event(event_type:String, bubbles:Boolean, cancelable:Boolean)

event_type パラメータは、Event オブジェクトの type プロパティです。bubbles および cancelable の各パラメータは省略可能で、これらのデフォルト値はどちらも false です。バブリングとキャプチャの詳細については、イベントの伝播を参照してください。

dispatchEvent() メソッドでは、カスタムイベントだけでなく任意のイベントを送出できます。ユーザーが Button コントロールをクリックしなくても、Button コントロールの click イベントを送出することが可能です。次に例を示します。

<?xml version="1.0"?>
<!-- events/DispatchEventExample.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="createListener(event)">
  <mx:Script><![CDATA[
     import mx.controls.Alert;
     private function createListener(e:Event):void {
        b1.addEventListener(MouseEvent.MOUSE_OVER, myEventHandler);
        b1.addEventListener(MouseEvent.CLICK, myClickHandler);
     }
     
     private function myEventHandler(e:Event):void {
        var result:Boolean = b1.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));           
     }
     
     private function myClickHandler(e:Event):void {
        Alert.show("Triggered by the " + e.type + " event");
     }
  ]]></mx:Script>
  <mx:Button id="b1" label="Click Me"/>
</mx:Application>

また、MXML タグ内でイベントを手動送出することもできます。次の例では、マウスポインタをボタンの上に移動すると、ボタンの click イベントがトリガされます。

<?xml version="1.0"?>
<!-- events/DispatchEventExampleInline.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="createListener(event)">
  <mx:Script><![CDATA[
     import mx.controls.Alert;
     private function createListener(e:Event):void {
        b1.addEventListener(MouseEvent.CLICK, myClickHandler);
     }
     
     private function myClickHandler(e:Event):void {
        Alert.show("Triggered by the " + e.type + " event");
     }
  ]]></mx:Script>
  <mx:Button id="b1" label="Click Me" mouseOver="b1.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false))"/>
</mx:Application>

Flex アプリケーションでは、新しく送出されたイベントを処理する必要はありません。リスナーがないイベントをトリガした場合、そのイベントは無視されます。

ActionScript で Event オブジェクトのプロパティを設定することは可能ですが、Event オブジェクトは動的でないため、新しいプロパティを追加することはできません。次の例では、click イベントを受け取り、新しい MouseEvent オブジェクトを作成および送出します。また、MouseEvent オブジェクトの shiftKey プロパティの値を true に設定し、Shift キーを押しながらクリックしたときと同じ動作がシミュレートされます。

<?xml version="1.0"?>
<!-- events/DispatchCustomizedEvent.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="addListeners()">
  <mx:Script><![CDATA[
     private function customLogEvent(e:MouseEvent):void {
        ta1.text = e.currentTarget.id + ":" +  e.type + ":" + e.shiftKey;
        
        // Remove current listener to avoid recursion.
        e.currentTarget.removeEventListener("click",customLogEvent);
     }
  
     private function handleEvent(e:MouseEvent):void {
        // Add new handler for custom event about to be dispatched.
        e.currentTarget.addEventListener("click",customLogEvent);

        // Create new event object.
        var mev:MouseEvent = new MouseEvent("click",false,false);

        // Customize event object.
        mev.shiftKey = true;

        // Dispatch custom event.
        e.currentTarget.dispatchEvent(mev);
     }
  
     private function addListeners():void {
        b1.addEventListener("click",handleEvent);
        b2.addEventListener("click",handleEvent);
     }
   
  ]]></mx:Script>

  <mx:VBox id="vb1">
     <mx:Button id="b1" label="B1"/>
     <mx:Button id="b2" label="B2"/>
     <mx:TextArea id="ta1"/>
  </mx:VBox>

</mx:Application>

カスタムプロパティを Event オブジェクトに追加する場合には、Event オブジェクトを拡張して、独自のカスタムクラスで新しいプロパティを定義する必要があります。これにより、他のイベントと同様に、dispatchEvent() メソッドを使用してカスタムイベントを手動で送出できるようになります。

UIComponent を拡張しないカスタム ActionScript クラスで独自のイベントを送出する場合は、flash.events.EventDispatcher クラスを拡張して、addEventListener()removeEventListener()、および dispatchEvent() の各メソッドにアクセスできるようにします。

カスタムクラスの作成の詳細については、『Flex 2 コンポーネントの作成と拡張』を参照してください。


Flex 2.01