| Flex 2 開発ガイド > Flex アプリケーションのユーザーインターフェイスの作成 > コンテナについて > コンテナの使用 > コンテナイベントの使用 > initialize イベントと creationComplete イベントについて | |||
コンテナの initialize イベントは、コンテナの直接の子コントロールがすべて関連付けられ、コンテナで最初に必要とされる子の preinitialize イベントが送出された後に送出されます。
コンテナまたはコントロールが initialize イベントを送出するとき、その初期プロパティは既に設定されていますが、幅と高さおよび位置はまだ計算されていません。initialize イベントは、コンテナの子の設定に役立ちます。たとえば、プログラムによる子の追加やコンテナのスクロールバースタイルの設定などにコンテナの initialize イベントを使用できます。また、コンテナまたはコンポーネントの initialize イベントを使用して、コントロールのデータプロバイダを初期化することもできます。
コンテナの creationComplete イベントは、最初に必要とされる子 (その子の必要な子孫をすべて含む) の処理がすべて完了し、画面に描画されたときに送出されます。たとえば、イベントハンドラで子のサイズや位置を使用する場合は、creationComplete イベントのリスナーを作成します。レイアウトプロパティを設定する処理のために creationComplete イベントを使用しないでください。そうすると、処理時間が余計にかかります。
イベントが送出される順序をわかりやすくするため、次の構造を持つアプリケーションを例にとります。
Application
OuterVBox
InnerVBox1
InnerVBoxLabel1
InnerVBox2
InnerVBoxLabel2
コンテナとコントロールの preinitialize イベント、initialize イベント、および creationComplete イベントは、次の順序で送出されます。各インデントは、上のアウトライン構造のインデントに対応します。
OuterVBox preinitialize
InnerVBox1 preinitialize
InnerVBox1Label preinitialize
InnerVBox1Label initialize
InnerVBox1 initialize
InnerVBox2 preinitialize
InnerVBox2Label preinitialize
InnerVBox2Label initialize
InnerVBox2 initialize
OuterVBox initialize
InnerBox1Label creationComplete
InnerVBox2Label creationComplete
InnerVBox1 creationComplete
InnerVBox2 creationComplete
OuterVBox creationComplete
この図を見ると、Label コントロールなどの末端コントロールは初期化前処理が終わってすぐに初期化されていることがわかります。コンテナでは、最も外側のコンテナから初期化前処理が始まり、最初のブランチの内側に進みます。続いて、初期化が同じブランチの外側に向かって進みます。この処理が、すべての初期化が完了するまで続きます。次に、creationComplete イベントの送出がリーフコンポーネントから始まり、続いてその親に進みます。この処理が、アプリケーションが creationComplete イベントを送出するまで続きます。
OuterVBox コンテナを、creationPolicy プロパティが auto に設定された ViewStack に変更すると、イベントの順序は次のようになります。
OuterViewStack preinitialize
InnerVBox1 preinitialize
InnerVBox2 preinitialize
OuterViewStack initialize
InnerBox1Label preinitialize
InnerBox1Label initialize
InnerVBox1 initialize
InnerBox1Label creationComplete
InnerVBox1 creationComplete
OuterViewStack creationComplete
この場合、2 番目の VBox は表示されないため、初期化前処理が行われるだけです。ナビゲータコンテナが initialize イベントを送出するとき、その子は存在し、子の preinitialize イベントは既に送出されていますが、その子自体の子はまだ作成されていないため、子の initialize イベントは送出されていません。creationPolicy プロパティの詳細については、『Flex 2 アプリケーションの構築および展開ガイド』の起動時のパフォーマンスの向上を参照してください。
initialize イベントは、ContainerCreationPolicy.AUTO 作成ポリシーが設定されたナビゲータコンテナの直接の子であるコンテナで役立ちます。たとえば、デフォルトでは、ViewStack が初期化されると、最初に表示される子コンテナが initialize イベントを送出します。ユーザーがコンテナの別の子に移動すると、その子コンテナのイベントが送出されます。
次の例は、initialize イベントのイベントリスナーを定義します。このイベントは、ユーザーが Accordion コンテナのパネル 2 に初めて移動したときに送出されます。
<?xml version="1.0"?>
<!-- containers\intro\AccordionInitEvent.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
public function pane2_initialize():void {
Alert.show("Pane 2 has been created");
}
]]>
</mx:Script>
<mx:Accordion width="200" height="100">
<mx:VBox id="pane1" label="Pane 1">
<mx:Label text="This is pane 1"/>
</mx:VBox>
<mx:VBox id="pane2"
label="Pane 2"
initialize="pane2_initialize();">
<mx:Label text="This is pane 2"/>
</mx:VBox>
</mx:Accordion>
</mx:Application>
Flex 2.01