使用Action Script动态添加组件

时间:2012-09-17 08:06:47

标签: actionscript-3 flex

刚开始学习Flex。但我对基本代码感到震惊。我试图检查如何通过Action Script将组件(比如按钮)添加到Application容器中。但我无法在输出中看到按钮。以下是我的代码,

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
             creationComplete="init()">
<fx:Script>
    <![CDATA[

             import mx.controls.Alert;

             import spark.components.Button;
             import spark.layouts.BasicLayout;

             private function init():void{
                 var bl:BasicLayout = new BasicLayout();
                 var app:Application = new Application();
                 var button1:Button = new Button();
                 var button2:Button = new Button();

                 button1.label ="Button one";
                 button1.x = 100;
                 button2.label = "Two";
                 button2.x = 30;
                 layout = bl;
                 addChild(button1);
                 addChild(button2);


             }
    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

我在这里做的错误是什么?

由于

2 个答案:

答案 0 :(得分:4)

此代码甚至应该抛出运行时错误,因为此处不允许您使用addChild 从Flex 4开始,有一个新的组件集(称为Spark)。向Spark容器添加可视项时,必须使用addElement方法。由于s:Application是一个Spark容器,你也应该在这里做。因此,只需在代码中将addChild替换为addElement即可。

你可能会问:如果我不能使用它,为什么“addChild”还在那里?
嗯,答案是:遗产。所有Flex组件(即mx和Spark)都继承自UIComponent,它实现了Flex框架的addChild方法(addChild实际上是DisplayObjectContainer的纯ActionScript方法类)。 addElement会做一些额外的事情(我在这里不会太技术化),这就是为什么你不能再使用addChild了。但是addChild仍然存在(继承自UIComponent)并且会抛出一个错误,告诉您不能使用此方法。

这是SkinnableComponent的相关代码:

override public function addChild(child:DisplayObject):DisplayObject
{
    throw(new Error(resourceManager.getString("components", "addChildError")));
}

答案 1 :(得分:0)

我不熟悉Basic LayOut,但我认为如果你保持代码简单就可以看到按钮:

 private function init():void{
            // var bl:BasicLayout = new BasicLayout(); 
            // var app:Application = new Application();
// 1. Create button
             var button1:Button = new Button();
             var button2:Button = new Button();
// 2. customize button
             button1.label ="Button one";
             button1.x = 100;
             button2.label = "Two";
             button2.x = 30;
// 3. add button into the container, 'this' is Applciation
           //  layout = bl;
             addElement(button1); // addChild for Flex3
             addElement(button2);
         }

修改你的代码然后再试一次,祝你好运!