我想制作一个标签上面有一个小标题的标签,例如标签说 $ 1,000 ,零售价或我们的价格< / em>在它上面。我正在尝试将标题标签添加到主标签的显示列表中。我没有错误,但标题没有出现。我也考虑过rawChildren,但显然Label没有rawChildren属性。
这是我的代码:
package
{
import mx.controls.Label;
public class PriceLabel extends StrikeThroughLabel //<-- exntension of label to add strike
{
private var _title:Label;
public function PriceLabel()
{
super();
}
[Bindable]
public function set title(s:String):void
{
if(_title == null)
{
_title = new Label();
addChild(_title);
this.alpha = .2;
}
_title.text = s;
}
public function get title():String
{
var s:String
if(_title != null)
{
s = _title.text;
}
return s;
}
}
}
答案 0 :(得分:2)
如果将子项添加到不是容器的Flex组件,则必须手动管理这些子项的大小和位置。容器为你做了很多工作。
这是你应该做的:
将子标签的创建移到createChildren()
函数的覆盖中。
在覆盖text
函数时设置子标签的commitProperties()
属性。您的title
getter和setter应将值保存在_title
变量中,以便稍后用于commitProperties()
中的分配。这对性能来说非常重要。
覆盖measure()
功能并将measuredWidth
和measuredHeight
更新为主标签及其子标签的最大宽度和高度值。
覆盖updateDisplayList()
并使用子标签上的setActualSize()
将其设置为所需的宽度和高度。
这可能看起来很多工作,但就最佳实践而言,这就是构建自定义组件的方式。 Adobe的Flex团队花费了大量时间来最大化性能,这就是为什么事情会在这样的几个步骤中发生。
根据你的要求,这是怎么做的。就个人而言,我会创建一个UIComponent的子类,其中包含两个Labels或UITextFields作为子项,每个子项都有自己独立的属性。
顺便说一句,rawChildren
属性仅适用于容器。它的存在使您可以将“chrome”添加到不属于容器的子布局算法的容器中。例如,Panel有一个标题栏和一个不受垂直/水平/绝对布局选项影响的边框。
答案 1 :(得分:1)
为什么不创建一个包含两个标签作为其子项的自定义组件,而不是尝试在Label上抛出子项?对我来说这感觉更干净,因为像这样的内置组件添加孩子似乎不对。