AS3添加相同的DisplayObject不会呈现TextField第二次

问题描述:

我遇到的问题是我期望出现多个TextField,并且我只看到一个出现。我已经缩小到这个代码。当我添加列表元素时,我会看到一个空矩形,其中有一个矩形,其大小正好与我所期望的一样。我看到的问题是TextField只出现在第二个矩形中。如果我添加三个元素,只有最后一个被显示。AS3添加相同的DisplayObject不会呈现TextField第二次

以下代码获取DisplayObjects(当前为两个TextFields)的列表,遍历列表并为每个列表创建一个容器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); 
     } 
    } 


} 
} 

问题不限于文本字段,而是像的DisplayObject。一个DisplayObject有许多DisplayObject。一个DisplayObject不'拥有并且属于许多'DisplayObject。

由于的DisplayObject只能有一个父对象引用,当相同的文本字段分配一个新的母公司,第一雪碧和文本字段之间原始关联丢失。第二个Sprite成为TextField的父项。

不能为两个或多个容器的子项添加相同的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); 
    } 
+0

这是正确的,但值得注意的是他会失去对第一个TextField的主要引用,并且获得它的唯一方法是通过数据数组。 – 2013-04-08 16:36:41

+0

我只是提示他错过了什么。我很抱歉有点懒。 Thanx纠正我@ Apocalyptic0n3 – Asad 2013-04-09 04:42:29