【问题标题】:From Flash CS to Flex Builder从 Flash CS 到 Flex Builder
【发布时间】:2012-06-05 16:56:10
【问题描述】:

我正在尝试将我的纯 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:类不能嵌套。

我已经浪费了好几个小时,好几次感到羞愧。有人可以在这里遮光吗?

【问题讨论】:

    标签: actionscript-3 flash apache-flex


    【解决方案1】:

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

    这是一种很好的方式来开发您的项目,这些项目具有包含资产的 FLA 文件等等。

    【讨论】:

    • +1 来自我。我不清楚海报的​​长期意图是什么,但这听起来是一个可行的选择。
    【解决方案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 Component LifeCycle,这里是Spark Component Lifecycle的信息。

    【讨论】:

      【解决方案3】:

      是的……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()”函数。

      【讨论】:

      • 这是我得到的:1042:this 关键字不能在静态方法中使用。它只能用在实例方法、函数闭包和全局代码中。
      • 更新答案以提供完整示例。
      • 如果你在 Flex 中;我强烈建议使用 Flex Componenht LifeCycle。 help.adobe.com/en_US/flex/using/… 在creationComplete 事件中添加一个孩子就像开车到目的地,然后因为忘记了什么而开车回家并重新开始旅程。应在 createChildren() 方法中创建子级。
      • 另外,由于这扩展了 S:Application,它是一个 Spark 组件,所以 addChild 会抛出运行时错误;并且您必须使用 addElement。 addElement 只接受一个 IVisualElement;很可能他的 AS 显示对象没有实现。
      【解决方案4】:

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

      【讨论】:

      • 虽然我不同意你的观点;我不认为这真的是问题的答案。您可以考虑删除您的答案并将其添加为对主要问题的评论。
      • 我的意图是将 BlazeDS 用于我的基于 Flash 的项目。我可以添加不是一项微不足道的任务!
      • 我确实考虑过这一点,但是,除非有什么我没有看到,否则我还没有选择对主要问题添加评论。
      【解决方案5】:

      我是这样解决的:

      <?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,所有问题都突然消失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多