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