0

我正在尝试将我的纯 Actionscript Flash 项目移植到 Flex Builder。

我创建了一个新项目,它打开一个 mxml 文件,如下所示:

<?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">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
        ]]>
    </fx:Script>
</s:Application>

现在,我试图在这个 mxml 文件中复制我的 Flash 文档类,但无济于事。

如果我在 fx:Script 中添加以下代码:

        addChild(new TradeShow());

我明白了:

1180:调用可能未定义的方法 addChild。

好的,所以 mxml 没有隐式的 DisplayObjectContainer。让我们尝试定义一个(总是在 fx:Script 中):

        public class TradeShow extends Sprite {}

这是另一个矛盾的错误:

1131:类不能嵌套。

我已经失去了几个小时,并为自己感到羞耻好几次。有人可以在这里遮光吗?

4

5 回答 5

2

我创建了一个新项目,它以这样的 mxml 文件打开

听起来您已经在 Flash Builder 中创建了一个 Flex 项目。除非您想移植 Flash Pro ActionScript 项目以使用 Flex 框架,否则我强烈建议您在 flash Builder 中创建一个 ActionScript 项目。

我怀疑这会解决你的大部分问题。


我正在编辑以添加有关 Flex 及其工作原理的更多信息。

如果我在 fx:Script 中添加以下代码:

    addChild(new TradeShow());

我明白了:

1180: Call to a possibly undefined method addChild.

我不太确定您为什么会收到该错误;但是 fx:Script 块内的代码必须在方法、导入语句或变量定义内。这与您编写的“普通”课程并没有什么不同。将 MXML 文件视为一个类;只是定义不同。MXML 由 Flex 编译器在后台生成到 ActionScript。MXML 应被视为一种 ActionScript 代码生成语言。

好的,所以 mxml 没有隐式的 DisplayObjectContainer。

那不是真的。Application类扩展了UIComponent——就像所有 Flex 视觉类一样——它在术语上扩展了 DisplayObjectContainer。因此,Application 类是一个 DisplayObjectContainer。我怀疑您出现上述错误的原因是代码的位置。

Let's try to define one (always inside fx:Script):

        public class TradeShow extends Sprite {}

Here is another contradicting error :

    1131: Classes must not be nested.

在我看来,这并不矛盾。应用程序是一个类。你正试图在其中定义一个新的。这在仅 ActionScript 的类中不起作用,在 MXML 类中也不起作用。

如果您真的想使用 Flex,那么您应该阅读 Flex 组件生命周期。这是MX 组件生命周期,这里是Spark 组件生命周期的信息。

于 2012-06-05T17:09:40.293 回答
2

您甚至可以在 Flash Builder 中创建一个 Flash Professional 项目并使用 Flash Builder 界面来构建代码,您可以通过 Flash Builder 和 Flash Professional 编译 swf。

这是开发具有带有资产的 FLA 文件的项目的好方法。

于 2012-06-05T18:39:31.623 回答
1

是的... Flex 有点不同。我不会弄乱类文件(甚至认为我应该这样做),所以我不能对此发表评论,但是要让 addChild 工作,只需执行以下操作:

<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:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
    <![CDATA[

    private function init():void
    {
        this.addChild(new TradeShow());
    }

    ]]>
</fx:Script>
</s:Application>

在主应用程序标签中添加了“creationComple”处理程序以及“init()”函数。

于 2012-06-05T17:09:23.710 回答
0

不应将纯 actionscript 项目重新创建为 flex 项目。您应该使用 AS3 项目选项,除非出于某种原因您需要弹性组件。移植到 flashbuilder 背后的意图是什么?

于 2012-06-05T19:24:43.723 回答
0

这是我解决它的方法:

<?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="1300" minHeight="700" applicationComplete="init()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            private function init():void
            {   
                var show:TradeShowOrig = new TradeShowOrig();
                this.stage.addChild(show);
                show.init();
            }
        ]]>
    </fx:Script>

</s:Application>

请注意,Flex 的“文档”类 mxml 被称为 TradeShow.mxml。我的主要课程同样被称为TradeShow.as。这导致了无法克服的问题,因为事情变得非常糟糕,没有明显的编译器错误。我不得不将我的文档类重命名为 TradeShowOrig.as,所有问题都突然消失了。

于 2012-06-07T19:15:19.357 回答