Flex では、Button コントロールのclick イベントなど、最も一般的なイベントの多くが定義されています。ただし、アプリケーションによっては、新しいイベントを作成する必要があります。カスタム Flex コンポーネントでは、コンポーネントによってスーパークラスから継承された定義済みのイベントを送出したり、コンポーネント内で定義した新しいイベントを送出したりできます。
カスタムコンポーネントから新しいイベントを送出するには、次の手順を実行する必要があります。
すべてのイベントは、イベントオブジェクトを使用してイベントに関する情報をイベントリスナーに送信します。すべてのイベントオブジェクトの基本クラスは、flash.events.Event クラスです。カスタムイベントを定義するときは、Event タイプのイベントオブジェクトを送出することも、異なるタイプのイベントオブジェクトを送出する Event クラスのサブクラスを作成することもできます。通常、イベントリスナーが必要とする情報を保持する新しいプロパティなど、イベントがイベントオブジェクトに情報を追加する必要がある場合は、Event クラスのサブクラスを作成します。
例えば、Flex Tree コントロールに関連付けられたイベントオブジェクトには、node プロパティが含まれます。このプロパティは、イベントに関連付けられた Tree コントロールのノードを識別します。node プロパティをサポートするために、Tree コントロールは Event クラスのサブクラスである TreeEvent タイプのイベントオブジェクトを送出します。
Event クラスのサブクラス内では、プロパティの追加、メソッドの追加、継承したプロパティの値の設定、または Event クラスから継承したメソッドのオーバーライドを実行できます。例えば、bubbles プロパティを true に設定して、Event クラスから継承したデフォルト設定値の false をオーバーライドすることができます。
この場合は、サブクラス内で Event.clone() メソッドをオーバーライドする必要があります。clone() メソッドは、type プロパティとすべての新規プロパティをクローン内に設定して、イベントオブジェクトのクローンされたコピーを返します。通常、clone() メソッドは、new 演算子によって作成されたイベントインスタンスを返すように定義されます。
イベントオブジェクトの一部として、コンポーネントの状態に関する情報をイベントリスナーに渡すものとします。そのためには、次の例に示すように、Event クラスのサブクラスを作成して、イベント EnableChangedEvent を作成します。
package myEvents
{
//events/myEvents/EnableChangeEvent.as
import flash.events.Event;
public class EnableChangeEvent extends Event
{
// Public constructor.
public function EnableChangeEvent(type:String,
isEnabled:Boolean=false) {
// Call the constructor of the superclass.
super(type);
// Set the new property.
this.isEnabled = isEnabled;
}
// Define static constant.
public static const ENABLE_CHANGED:String = "enableChanged";
// Define a public variable to hold the state of the enable property.
public var isEnabled:Boolean;
// Override the inherited clone() method.
override public function clone():Event {
return new EnableChangeEvent(type, isEnabled);
}
}
}
この例では、カスタムクラスは 2 つのパラメータを取るパブリックコンストラクタを定義します。
コンストラクタの本体内から、super() メソッドを呼び出し、基本クラスプロパティを初期化します。
[Event] メタデータタグを使用して、コンポーネントによって送出されるイベントを定義できます。これによって、Flex コンパイラは MXML ファイル内でそれらを MXML タグパラメータとして認識できます。[Event] メタデータタグは、次のいずれかの位置に追加します。
ActionScript コンポーネント パッケージ定義内のクラス定義の上。これにより、イベントはクラスの特定のメンバーではなくクラス全体にバインドされます。
MXML コンポーネント MXML ファイル内の <mx:Metadata> タグ内。
Event メタデータキーワードのシンタックスは次のとおりです。
[Event(name="eventName", type="package.eventType")]
eventName パラメータには、パッケージを含むイベントの名前を指定します。eventType パラメータはイベントを定義するクラスを指定します。
次の例では、ActionScript コンポーネントが送出できるイベントとして enableChange イベントを指定しています。
[Event(name="enableChange", type="myEvents.EnableChangeEvent")]
public class MyComponent extends TextArea
{
...
}
次の例は、MXML ファイル内の <mx:Metadata> タグ内の [Event] メタデータタグを示しています。
<?xml version="1.0"?>
<!-- events\myComponents\MyButton.mxml -->
<mx:Button xmlns:mx="http://www.adobe.com/2006/mxml"
click="dispatchEvent(new EnableChangeEvent('enableChanged'));">
<mx:Script>
<![CDATA[
import myEvents.EnableChangeEvent;
]]>
</mx:Script>
<mx:Metadata>
[Event(name="enableChanged", type="myEvents.EnableChangeEvent")]
</mx:Metadata>
</mx:Button>
次の例に示すように、[Event] メタデータタグを使用してイベントを定義すると、MXML ファイル内のイベントを参照できます。
<?xml version="1.0"?>
<!-- events/MainEventApp.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:MyComp="myComponents.*" >
<mx:Script>
<![CDATA[
import myEvents.EnableChangeEvent;
public function
enableChangedListener(eventObj:EnableChangeEvent):void {
// Handle event.
}
]]>
</mx:Script>
<MyComp:MyButton enableChanged="myTA.text='got event';" />
<mx:TextArea id="myTA" />
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
[Event] メタデータタグを使用してイベントを指定せず、MXML 内でそのイベント名を使用しようとすると、コンパイラによりエラーが生成されます。ただし、イベントのメタデータはスーパークラスから継承されるので、スーパークラスで [Event] メタデータタグによって既にタグが定義されたイベントには、タグを付ける必要がありません。
dispatchEvent() メソッドを使用して、イベントを送出します。dispatchEvent() メソッドのシグネチャを次に示します。
public dispatchEvent(event:Event):Boolean
このメソッドには Event タイプのパラメータが必要です。Event タイプはイベントオブジェクトを示します。dispatchEvent() メソッドは、イベントを送出するコンポーネントを参照するイベントオブジェクトの target プロパティを初期化します。
次の例に示すように、1 行のステートメントでイベントオブジェクトの作成とイベントの送出を実行できます。
dispatchEvent(new Event("click"));
また、次の例に示すように、イベントオブジェクトの作成、初期化、送出も実行できます。
var eventObj:EnableChangeEvent = new EnableChangeEvent("enableChange");
eventObj.isEnabled=true;
dispatchEvent(eventObj);
カスタムイベントの作成と送出の詳細な例については、高度な MXML コンポーネントおよびActionScript のシンプルなビジュアルコンポーネントを参照してください。
通常、イベントクラスのコンストラクタには、イベントオブジェクトの type プロパティの値を指定する 1 つの必須パラメータがあります。前のセクションでは、次の例に示すように、ストリング enableChange をコンストラクタに渡しました。
// Define event object, initialize it, then dispatch it.
var eventObj:EnableChangeEvent = new EnableChangeEvent("enableChange");
dispatchEvent(eventObj);
Flex コンパイラは、コンストラクタに渡されたストリングを調べてそれが有効かどうかを判別する作業は行いません。したがって、enableChangeAgain が type プロパティの有効な値でない場合でも、次のコードはコンパイルされます。
var eventObj:EnableChangeEvent =
new EnableChangeEvent("enableChangeAgain");
コンパイラは type プロパティの値をチェックしないため、アプリケーションが enableChangeAgain か有効かどうかを判断できるのは、実行時だけです。
ただし、type プロパティの値がコンパイル時に有効であることを保証するため、Flex イベントクラスでは type プロパティの有効な値について静的定数を定義します。例えば、Flex EffectEvent クラスは、次の静的定数を定義します。
// Define static constant for event type. public static const EFFECT_END:String = "effectEnd";
EffectEvent クラスのインスタンスを作成するには、次のコンストラクタを使用します。
var eventObj:EffectEvent = new EffectEvent(EffectEvent.EFFECT_END);
コンストラクタ内で定数を不正に参照した場合、コンパイラでは、関連付けられた定数を見つけ出せないため、シンタックスエラーが生成されます。例えば、次のコンストラクタは、MY_EFFECT_END が EffectEvent クラスの事前定義された定数でないため、コンパイル時にシンタックスエラーが生成されます。
var eventObj:EffectEvent = new EffectEvent(EffectEvent.MY_EFFECT_END);
イベントクラスを定義するときに、この手法を使用できます。次の例では、EnableChangeEventConst クラスの定義を変更して、type プロパティの静的定数を追加します。
package myEvents
{
//events/myEvents/EnableChangeEventConst.as
import flash.events.Event;
public class EnableChangeEventConst extends Event
{
// Public constructor.
public function EnableChangeEventConst(type:String,
isEnabled:Boolean=false) {
// Call the constructor of the superclass.
super(type);
// Set the new property.
this.isEnabled = isEnabled;
}
// Define static constant.
public static const ENABLE_CHANGED:String = "myEnable";
// Define a public variable to hold the state of the enable property.
public var isEnabled:Boolean;
// Override the inherited clone() method.
override public function clone():Event {
return new EnableChangeEvent(type, isEnabled);
}
}
}
ここで、次の例で MyButtonConst カスタムコンポーネントについて示すように、静的定数を使用してクラスのインスタンスを作成します。
<?xml version="1.0"?>
<!-- events\myComponents\MyButtonConst.mxml -->
<mx:Button xmlns:mx="http://www.adobe.com/2006/mxml"
click="dispatchEvent(new EnableChangeEventConst(EnableChangeEventConst.ENABLE_CHANGED));">
<mx:Script>
<![CDATA[
import myEvents.EnableChangeEventConst;
]]>
</mx:Script>
<mx:Metadata>
[Event(name="myEnable", type="myEvents.EnableChangeEventConst")]
</mx:Metadata>
</mx:Button>
この手法によって、ストリングのコンストラクタへの受け渡しが妨げられることはありません。
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート