使用class和itemRenderer强制意外行为

时间:2011-05-27 09:26:16

标签: flex actionscript-3 itemrenderer

我陷入了一种我没想到的行为,请解释我理解并解决它。 - 问题如下:我有一个持有标签的类,这个类在itemRenderer中使用,因为整个事情都有异常,但它不会显示标签的文本。 我试过添加一个Button但问题仍然存在 - 它实际上从未添加过按钮。

为什么?

public class BusTreeNode extends UIComponent
{
    protected var label : Label;

    public function BusTreeNode()
    {
        super();

        label = new Label();
        this.addChild( label );
        label.x    = 40;
        label.y    = 2; 
        label.text = "test";
    }
}

...在itemRenderer中:

<sl:BusTreeNode width="100%" />

2 个答案:

答案 0 :(得分:2)

我想问题是你的measure()课程中没有BusTreeNode实施。所以你的组件默认大小为0x0。这个声明:

<sl:BusTreeNode width="100%" />

仍然给出0作为高度。

您可以阅读有关测量here的Flex组件的更多信息。 this article对于创建自定义组件非常有用。

答案 1 :(得分:1)

从Spark(或Flex 3中的mx)ItemRenderer类扩展起来更容易。像这样创建一个新的MXML文件:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" >

    <!-- label -->
    <s:Label id="labelDisplay" />

</s:ItemRenderer>

'labelDisplay'的'text'属性将由其使用的List(或其他数据组件)自动设置。

此外,在Flex组件生命周期中,应将可视元素添加到createChildren()方法中的displayList。因此,如果你绝对想用纯ActionScript编写它,你可以这样做,但它更难:

public class MyItemRenderer extends ItemRenderer {

    private var button:Button;

    override protected function createChildren():void {
        super.createChildren();

        button = new Button();
        addElement(button);
    }

    override public function set label(value:String):void {
        super.label = button.label = value;
    }

}