0

我遇到的问题是我希望出现多个 TextField,而我只看到一个出现。我已将其范围缩小到此代码。当我添加 List 元素时,我看到一个空矩形,下面有一个与我预期的大小完全相同的矩形。我看到的问题是 TextField 只出现在第二个矩形中。如果我添加三个元素,则只有最后一个元素是可视化的。

下面的代码获取一个 DisplayObject 列表(当前是两个 TextField),遍历该列表,并为每个创建一个容器 Sprite。每个容器的 Sprite 都被每个 DisplayObject 高度的高度偏移,有效地创建了一个视觉列表。如果相同的 TextField 在列表中使用了两次或更多次,则仅在最后一个元素中绘制 TextField。每个容器 Sprite 都包含一个边界框以指示它存在。

package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.text.AntiAliasType;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;

public class List extends Sprite
{
    private var data:Array=new Array;
    private var label:TextField= new TextField();

    public function List()
    {
        super();

        label.selectable=true;
        label.autoSize              = TextFieldAutoSize.LEFT;
        label.antiAliasType         = AntiAliasType.ADVANCED;
        label.text                  = "Testing";
        data.push(label);
        data.push(label);

    }


    public function renderList():void{
        var height:int=0;
        for (var i:int=0; i< data.length; i++){
            //get current sprite in list
            var current:DisplayObject=data[i];

            //create new sprite to contain element of array
            var listItem:Sprite=new Sprite;
            listItem.addChild(current);

            //draw bounding rectangle for reference
            var rect:Rectangle=current.getBounds(this);
            listItem.graphics.lineStyle(1, 0x000000);
            listItem.graphics.beginFill(0xFFFFFF);
            listItem.graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
            listItem.graphics.endFill();

            //set height corresponding to bounds height
            listItem.y=height;

                            //calculate height for next item
            height=height + rect.height;

                            //add new list item 
            addChild(listItem);
        }
    }


}
}
4

2 回答 2

3

您不能将相同的 TextField 对象添加为两个或多个容器的子项。您需要new TextField()在代码中的某处再次添加。

就像如果您如下修改构造函数一样,您将能够看到两个 TextField

public function List()
    {
        super();

        label.selectable=true;
        label.autoSize              = TextFieldAutoSize.LEFT;
        label.antiAliasType         = AntiAliasType.ADVANCED;
        label.text                  = "Testing 1";
        data.push(label);
        label = new TextField();
        label.selectable=true;
        label.autoSize              = TextFieldAutoSize.LEFT;
        label.antiAliasType         = AntiAliasType.ADVANCED;
        label.text                  = "Testing 2";
        data.push(label);
    }
于 2013-04-08T04:58:35.813 回答
2

问题不仅限于 TextField,而是 DisplayObject。一个 DisplayObject 有许多 DisplayObject。DisplayObject 没有“拥有且属于许多”DisplayObject。

由于 DisplayObject 只能引用一个父对象,因此当为同一个 TextField 分配新的父对象时,第一个 Sprite 和 TextField 之间的原始关联就会丢失。第二个 Sprite 成为 TextField 的父级。

于 2013-04-14T01:26:56.770 回答