表示リストの操作

すべての ActionScript 3.0 コンポーネントは、DisplayObject クラスから継承されるので、そのメソッドとプロパティにアクセスし、表示リストとやり取りします。 表示リストは、表示されるオブジェクトとビジュアルエレメントのアプリケーション内での階層です。この階層には次のエレメントが含まれます。

  • ステージ。トップレベルのコンテナです。

  • 表示オブジェクト。シェイプ、ムービークリップ、テキストフィールドなどを含みます。

  • 表示オブジェクトコンテナ。子表示オブジェクトを含むことができる特殊な表示オブジェクトです。

表示リスト内のオブジェクトの順序によって、親コンテナ内での深度が決まります。 オブジェクトの深度は、ステージ上または表示コンテナ内の一番上から下へ、または最前面から背面への位置を示します。深度の順序はオブジェクトが重なっているときには明白ですが、重なっていないときでも存在します。 表示リストのすべてのオブジェクトに、ステージ上の対応する深度があります。 オブジェクトを他のオブジェクトの前面または背面に移動してオブジェクトの深度を変更する場合は、表示リスト内の位置を変更する必要があります。表示リスト内のオブジェクトのデフォルト順序は、オブジェクトがステージ上に置かれた順序です。 表示リストの位置 0 は、深度順序の底にあるオブジェクトです。

表示リストへのコンポーネントの追加

コンテナの addChild() または addChildAt() メソッドを呼び出して、オブジェクトを DisplayObjectContainer オブジェクトに追加できます。ステージの場合はオーサリング時にオブジェクトを作成し、コンポーネントの場合はオブジェクトをコンポーネントパネルからステージにドラッグすることによって、オブジェクトを表示リストに追加することもできます。 ActionScript を使用してオブジェクトをコンテナに追加するには、まず new 演算子を指定してコンストラクターを起動し、そのインスタンスを作成してから、 addChild() または addChildAt() メソッドを呼び出してステージ上および表示リストに配置します。 addChild() メソッドはオブジェクトを表示リストの次の位置に配置しますが、 addChildAt() メソッドはオブジェクトを追加する位置を指定します。指定した位置に既にオブジェクトがある場合、その位置にあるオブジェクト、およびそれよりも上位にあるオブジェクトが 1 つ上の位置に移動します。DisplayObjectContainer オブジェクトの numChildren プロパティは、含んでいる表示オブジェクトの数を保持します。表示リストからオブジェクトを取得するには、 getChildAt() メソッドを呼び出して位置を指定するか、オブジェクトの名前がわかっている場合は、 getChildByName() メソッドを呼び出します。

注意: 表示リスト内のコンポーネントに名前でアクセスするには、ActionScript を使用してコンポーネントを追加するときに、name プロパティに名前を割り当てる必要があります。

次の例は、表示リスト内の 3 つのコンポーネントの名前と位置を表示します。 最初に、NumericStepper、Button および ComboBox を互いに重なるようにステージにドラッグし、インスタンス名 aNs aButton および aCb を指定します。続いて、次のコードをタイムラインのフレーム 1 のアクションパネルに追加します。

var i:int = 0; 
while(i < numChildren) { 
    trace(getChildAt(i).name + " is at position: " + i++); 
}

出力パネルに次の行が表示されます。

aNs is at position: 0 
aButton is at position: 1 
aCb is at position: 2

表示リスト内のコンポーネントの移動

表示リスト内のオブジェクトの位置および表示深度を変更するには、 addChildAt() メソッドを呼び出して、オブジェクトの名前と配置する位置をメソッドのパラメーターとして指定します。例えば、次のコードを前の例に追加して、NumericStepper を一番上に配置し、このループを繰り返して表示リスト内のコンポーネントの新しい位置を表示します。

this.addChildAt(aNs, numChildren - 1); 
i = 0; 
while(i < numChildren) { 
    trace(getChildAt(i).name + " is at position: " + i++); 
}

出力パネルに次の内容が表示されます。

aNs is at position: 0 
aButton is at position: 1 
aCb is at position: 2 
aButton is at position: 0 
aCb is at position: 1 
aNs is at position: 2

NumericStepper は、画面上の他のコンポーネントの前にも表示されます。

numChildren は表示リスト内のオブジェクトの数であり(1 ~ n)、リスト内の最初の位置は 0 です。そのため、リスト内に 3 つのオブジェクトがある場合、3 番目のオブジェクトのインデックス位置は 2 になります。したがって、表示リストの最後の位置、または表示深度の一番上のオブジェクトは、 numChildren - 1 として参照できます。

表示リストからのコンポーネントの削除

表示オブジェクトコンテナおよびその表示リストからコンポーネントを削除するには、 removeChild() メソッドと removeChildAt() メソッドを使用します。次の例は、3 つの Button コンポーネントをステージ上で互いの前に配置し、それぞれのイベントリスナを追加します。 各 Button をクリックすると、イベントハンドラーがその Button を表示リストおよびステージから削除します。

  1. 新しい Flash ファイル (ActionScript 3.0) ドキュメントを作成します。

  2. Button をコンポーネントパネルからライブラリパネルまでドラッグします。

  3. アクションパネルを開き、メインタイムラインのフレーム 1 を選択して、次のコードを追加します。

    import fl.controls.Button; 
     
    var i:int = 0; 
    while(i++ < 3) { 
        makeButton(i); 
    } 
    function removeButton(event:MouseEvent):void { 
        removeChildAt(numChildren -1); 
    } 
    function makeButton(num) { 
        var aButton:Button = new Button(); 
        aButton.name = "Button" + num; 
        aButton.label = aButton.name; 
        aButton.move(200, 200); 
        addChild(aButton); 
        aButton.addEventListener(MouseEvent.CLICK, removeButton); 
    }

    表示リストの詳細については、『 ActionScript 3.0 のプログラミング 』の「表示のプログラミング」を参照してください。