イベントのサブクラスの使用

イベントのタイプによっては、Event オブジェクトにさまざまなプロパティを含めることができます。これらのプロパティは、W3C の仕様 (www.w3.org/TR/DOM-Level-3-Events/events.html) に規定されているプロパティに基づいていますが、仕様に規定されているすべてのプロパティが Flex で実装されているわけではありません。

リスナー関数で Event オブジェクトを宣言する際には、そのオブジェクトを Event 型として宣言するか、または Event オブジェクトのサブクラスを指定します。次の例では、Event オブジェクトのタイプを MouseEvent に指定しています。

public function performAction(e:MouseEvent):void {
    ...
}

ほとんどのコントロールでは、特定のイベントタイプのオブジェクトが生成されます。たとえば、マウスクリックでは、MouseEvent タイプのオブジェクトが生成されます。より詳細なイベントタイプを指定することにより、Event オブジェクトを他のオブジェクトにキャストしなくても、特定のプロパティにアクセスすることができます。また、Event オブジェクトの一部のサブクラスには、固有のメソッドを持つものがあります。たとえば LogEvent には、ログレベルをストリングとして返す getLevelString() メソッドがあります。汎用的な Event オブジェクトには、このメソッドは含まれていません。

実行時に定義するイベントオブジェクトには、コンパイル時の型のサブクラスを指定できます。特定のイベントタイプを宣言していない場合でも、Event オブジェクトを特定のタイプにキャストすれば、イベントリスナー内のイベント固有のプロパティにアクセスすることができます。次の関数の例では、オブジェクトタイプ Event を定義します。ただし、関数内で MouseEvent クラスに固有の localX プロパティおよび localY プロパティにアクセスするには、Event オブジェクトを MouseEvent タイプにキャストする必要があります。

<?xml version="1.0"?>
<!-- events/AccessEventSpecificProperties.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">
  <mx:Script><![CDATA[
     private function customLogEvent(e:Event):void {
        var a:MouseEvent = MouseEvent(e);
        trace(a.localY + ":" + a.localX);
     }

     private function addListeners():void {
        b1.addEventListener(MouseEvent.CLICK, customLogEvent);
     }
  ]]></mx:Script>
  <mx:VBox id="vb1">
     <mx:Button id="b1" label="Click Me"/>
  </mx:VBox>
</mx:Application>

Event オブジェクトを特定のタイプとして宣言した場合は、ハンドラでそのオブジェクトをキャストする必要はありません。次に例を示します。

private function customLogEvent(e:MouseEvent):void { ... }

前の例では、プロパティにアクセスするためだけに Event オブジェクトをキャストすることもできます。その場合は、次の例に示すシンタックスを使用します。

<?xml version="1.0"?>
<!-- events/SinglePropertyAccess.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">
  <mx:Script><![CDATA[
     private function customLogEvent(e:Event):void {
        trace(MouseEvent(e).localY + ":" + MouseEvent(e).localX);
     }

     private function addListeners():void {
        b1.addEventListener(MouseEvent.CLICK, customLogEvent);
     }
  ]]></mx:Script>
  <mx:VBox id="vb1">
     <mx:Button id="b1" label="Click Me"/>
  </mx:VBox>
</mx:Application>

こうすると、メモリとシステムリソースの消費量を抑えることができます。ただし、イベントのタイプはできる限り詳細に宣言することをお勧めします。

Event オブジェクトの各サブクラスには、そのイベントのカテゴリに固有のプロパティおよびイベントタイプが追加されています。MouseEvent クラスでは、その入力デバイスに関連したイベントタイプが複数定義されています。これには、CLICKDOUBLE_CLICKMOUSE_DOWNMOUSE_UP などのイベントタイプがあります。

各 Event サブクラスのタイプの一覧については、『Adobe Flex 2 リファレンスガイド』のサブクラスの項目を参照してください。


Flex 2.01