在项呈示器中在运行时创建自定义组件

时间:2011-02-16 10:04:09

标签: java runtime custom-component itemrenderers

我正在尝试使用我的网站页面的封面流布局,即列表中的每个项目不是图像或面板,而是整个页面本身。这些页面本质上是自定义组件。

我想要的是能够在我的ItemRenderer中在运行时创建自定义组件的实例。例如,这是显示封面流布局的代码:

<s:List id="pageList" depth="0" itemRenderer="com.helpdesk.proj.renderers.pageRenderer"
        dataProvider="{menuItems}" selectedIndex="{navigationButtonGroup.selectedIndex}" borderVisible="false" 
        x="5" y="200" width="100%" height="500">
    <s:layout>
        <layouts:CoverFlowLayout id="hdCoverflow"
                                 horizontalDistance="85"
                                 selectedItemProximity="50"
                                 selectedIndex="{pageList.selectedIndex}"
                                 depthDistance="1" 
                                 elementRotation="-70" 
                                 focalLength="300"
                                 perspectiveProjectionX="-1" 
                                 perspectiveProjectionY="-1"/>
    </s:layout>
</s:List>

列表的数据提供程序,基本上是一个对象数组,其中包含顶部导航栏的名称(字符串)(home,about,contact us等)。我创建了具有相同名称的自定义组件。我有一个名为“home”,“about”等的自定义组件。

因此,在项呈示器中,我想创建相应自定义组件的实例。到目前为止,这就是我所拥有的:

<?xml version="1.0" encoding="utf-8"?>

             

        import mx.core.UIComponent;
        import mx.events.FlexEvent;

        [Bindable]private var currItem:String = data.name;
        protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void
        {
            var myClass:Class = Class(getDefinitionByName(currItem));
            var mycomp:Object = new myClass();

        }

    ]]>
</fx:Script>    

我希望“mycomp”将包含当前自定义组件的实例。如何将此对象添加到应用程序? 我尝试了parentDocument.addChild,但它抛出了一个错误。还有其他方法可以做到这一切吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

override protected function commitProperties():void {
    super.commitProperties();
    addCustomecomponent();
}

public function addCustomcomponent():void{

var myClass:Class = Class(getDefinitionByName(currItem));
            var mycomp:Object = new myClass();
    addElement(mycomp);   // addChild if you are using flex 3.6 or below

}