표시 목록 순회

Flash Player 9 이상, Adobe AIR 1.0 이상

이미 알고 있듯이 표시 목록은 트리 구조입니다. 트리의 맨 위에는 스테이지가 있고 여기에는 여러 표시 객체를 포함할 수 있습니다. 자체가 표시 객체 컨테이너인 이러한 표시 객체는 다른 표시 객체나 표시 객체 컨테이너를 포함할 수 있습니다.

DisplayObjectContainer 클래스에는 표시 객체 컨테이너의 자식 목록을 사용하여 표시 목록을 순회하기 위한 속성과 메서드가 포함되어 있습니다. 예를 들어, 두 표시 객체 title pict container 객체(Sprite 객체, Sprite 클래스는 DisplayObjectContainer 클래스를 확장)에 추가하는 다음 코드를 살펴봅니다.

var container:Sprite = new Sprite(); 
var title:TextField = new TextField(); 
title.text = "Hello"; 
var pict:Loader = new Loader(); 
var url:URLRequest = new URLRequest("banana.jpg"); 
pict.load(url); 
pict.name = "banana loader"; 
container.addChild(title); 
container.addChild(pict);

getChildAt() 메서드는 특정 인덱스 위치에 있는 표시 목록의 자식을 반환합니다.

trace(container.getChildAt(0) is TextField); // true

이름을 기준으로 자식 객체에 액세스할 수도 있습니다. 각 표시 객체에는 name 속성이 있습니다. 이 속성을 할당하지 않을 경우 Flash Player 또는 AIR는 "instance1" 과 같은 기본값을 할당합니다. 예를 들어, 다음 코드는 getChildByName() 메서드를 사용하여 이름이 "banana loader" 인 자식 표시 객체에 액세스하는 방법을 보여 줍니다.

trace(container.getChildByName("banana loader") is Loader); // true

getChildByName() 메서드를 사용하면 getChildAt() 메서드를 사용할 때보다 속도가 느려질 수 있습니다.

표시 객체 컨테이너는 다른 표시 객체 컨테이너를 표시 목록에 자식 객체로 포함할 수 있기 때문에 응용 프로그램의 전체 표시 목록을 트리로 순회할 수 있습니다. 예를 들어, 앞에서 인용한 코드에서 pict Loader 객체의 로드 작업이 완료되면 pict 객체에 비트맵인 자식 표시 객체 하나가 로드됩니다. 이 비트맵 표시 객체에 액세스하려면 pict.getChildAt(0) 을 입력합니다. 또한 container.getChildAt(0).getChildAt(0) ( container.getChildAt(0) == pict 이기 때문)를 입력할 수도 있습니다.

다음 함수는 표시 객체 컨테이너에서 표시 목록의 trace() 출력을 들여쓰기 형식으로 표시합니다.

function traceDisplayList(container:DisplayObjectContainer,                                                indentString:String = ""):void 
{ 
    var child:DisplayObject; 
    for (var i:uint=0; i < container.numChildren; i++) 
    { 
        child = container.getChildAt(i); 
        trace(indentString, child, child.name);  
        if (container.getChildAt(i) is DisplayObjectContainer) 
        { 
            traceDisplayList(DisplayObjectContainer(child), indentString + "    ") 
        } 
    } 
}

Adobe Flex

Flex를 사용하는 경우 Flex가 다양한 구성 요소 표시 객체 클래스를 정의하며, 이러한 클래스는 DisplayObjectContainer 클래스의 표시 목록 액세스 메서드를 재정의한다는 것을 알아야 합니다. 예를 들어, mx.core 패키지의 Container 클래스는 Container 클래스가 확장하는 DisplayObjectContainer 클래스의 addChild() 메서드 및 기타 메서드를 재정의합니다. addChild() 메서드의 경우 이 클래스는 Flex의 Container 인스턴스에 모든 유형의 표시 객체를 추가할 수는 없도록 메서드를 재정의합니다. 이 경우 재정의된 메서드에서는 추가 중인 자식 객체가 mx.core.UIComponent 객체 유형이어야 합니다.