Flex:Label.addChild()不起作用?

时间:2009-05-07 18:40:52

标签: flex

我想制作一个标签上面有一个小标题的标签,例如标签说 $ 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;
        }

    }
}

2 个答案:

答案 0 :(得分:2)

如果将子项添加到不是容器的Flex组件,则必须手动管理这些子项的大小和位置。容器为你做了很多工作。

这是你应该做的:

  1. 将子标签的创建移到createChildren()函数的覆盖中。

  2. 在覆盖text函数时设置子标签的commitProperties()属性。您的title getter和setter应将值保存在_title变量中,以便稍后用于commitProperties()中的分配。这对性能来说非常重要。

  3. 覆盖measure()功能并将measuredWidthmeasuredHeight更新为主标签及其子标签的最大宽度和高度值。

  4. 覆盖updateDisplayList()并使用子标签上的setActualSize()将其设置为所需的宽度和高度。

  5. 这可能看起来很多工作,但就最佳实践而言,这就是构建自定义组件的方式。 Adobe的Flex团队花费了大量时间来最大化性能,这就是为什么事情会在这样的几个步骤中发生。

    根据你的要求,这是怎么做的。就个人而言,我会创建一个UIComponent的子类,其中包含两个Labels或UITextFields作为子项,每个子项都有自己独立的属性。

    顺便说一句,rawChildren属性仅适用于容器。它的存在使您可以将“chrome”添加到不属于容器的子布局算法的容器中。例如,Panel有一个标题栏和一个不受垂直/水平/绝对布局选项影响的边框。

答案 1 :(得分:1)

为什么不创建一个包含两个标签作为其子项的自定义组件,而不是尝试在Label上抛出子项?对我来说这感觉更干净,因为像这样的内置组件添加孩子似乎不对。