var text_content:TextField=new TextField();
text_content.autoSize="left"; //
text_content.width=text_content.width + 1; //
text_content.x=10; //
text_content.wordWrap=true; //
text_content.multiline=true; //
text_content.text="ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
addChild(text_content);
上面一段代码,能看出什么问题吗?
其实运行后,在舞台上是看不到textfield的~
同样的的一段代码,分部注释每行,再进行调试,
var text_content:TextField=new TextField();
text_content.autoSize="left"; //如果单注释这句,text正常显示
text_content.width=text_content.width + 1; //如果单注释这句,舞台上看不到text
text_content.x=10; ////如果单注释这句,舞台上看不到text, 如果同时注释width x这两个属性的设置,text又正常显示
text_content.wordWrap=true; //如果单注释这句,text正常显示
text_content.multiline=true; //这句注释不注释都没影响
text_content.text="ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
addChild(text_content);
trace(text_content.width);
后面的注释写明了如果把这行注释掉会有什么效果。
在神奇的TextField(1)中,有提过说wordwrap autosize text对width都有决定作用。只是上面的例子都有一个特点就是,在设置wordwrap,autosize text这些属性后,就立即去读取textfield的width~
而通过这篇文章的例子可以看出,wordwrap autosize text对width都有决定作用,但都不是在设置wordwrap,autosize,text属性的时候就立即修改width属性!!
而是在获取或设置width属性时,flash通过wordwrap autosize text这些影响因素动态的计算width结果然后返回。
同样,在设置text的x,y坐标时,也flash也会计算textfield的width!!
textfield内部有一个字段(姑且称为_width),在获取textfield的width属性时,
如果需要计算(在wordwarp为false的时候),就进行计算,并用_width保存这个计算结果,之后返回_width,
如果不需要计算(在wordwarp为true的时候)就直接返回_width属性的值,但这时,_width属性并不是正确的,
因为在设置wordwrap为true以后,再修改text属性,应该是会导致width发生变化的,但实际上,textfield的width在设置wordwrap为true之后无论text是什么都不会再变了。
这样子就比较好解释上面的代码,为什么设置了width或者x属性时,stage上的textfield就看不到了。
因为在设置width或者x属性时,textfield的width就会被动态计算,示例代码中autosize为left,text为空,那么width在计算时就由初始值变成了4,而之后因为设置了wordwrap属性为true,当再设置text的时候,textfield的width并不会发生改变。所以textfield的width就一直是4,stage上就看不到这个textfield了.
wordwrap这个和类的构造函数有点类似,
当自定义了类的构造函数,系统不在为你添加默认构造函数了
当设置了wordwrap为true时,系统就默认你自定义了textfield的width(这个值就是在设置),之后在需要width属性时就不再计算了。