Open Laszlo 5.0.x中的默认位置无法正常工作

时间:2012-08-16 13:19:32

标签: constraints openlaszlo lzx

当我尝试在类似$once{property}的类中使用此类默认展示位置时,会出现以下错误。

Exception in thread "main" org.openlaszlo.sc.parser.TokenMgrError: Lexical error at line 25, column 249.  Encountered: "@" (64), after : ""
     [exec]     at org.openlaszlo.sc.parser.ParserTokenManager.getNextToken(ParserTokenManager.java:2565)
     [exec]     at org.openlaszlo.sc.parser.Parser.jj_scan_token(Parser.java:10271)
     [exec]     at org.openlaszlo.sc.parser.Parser.jj_3_5(Parser.java:8325)
     [exec]     at org.openlaszlo.sc.parser.Parser.jj_2_5(Parser.java:7224)
     [exec]     at org.openlaszlo.sc.parser.Parser.CallExpression(Parser.java:1312)
     [exec]     at org.openlaszlo.sc.parser.Parser.PostfixExpression(Parser.java:1521)

我已在此网址中放置了示例代码。代码在OL 3.3中工作正常,但在4.9和5.0中没有。 任何关于它为什么不起作用的想法都会有所帮助。

http://forum.openlaszlo.org/showthread.php?p=48740#post48740

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题。首先,defaultplacement属性的双引号语法:

<attribute name="defaultplacement" value="'insideview'"/>

这是一种旧语法,最近版本的OpenLaszlo不需要这种语法。另一个问题是$ once {}约束的使用,甚至不需要 - 这会导致编译器异常。

<attribute name="defaultplacement" value="$once{test.defaultplacement}"/>   

但是让我用一个简单的代码示例澄清我的意思:

<canvas>

  <class name="blackbox" extends="view">
    <attribute name="bgcolor" value="black"/>
    <attribute name="defaultplacement" value="blackinner"/>
    <view name="blackinner" bgcolor="green"
          x="10" y="10" width="${parent.width-20}" height="${parent.height-20}">

    </view>
  </class>

  <class name="redbox" extends="view">
    <attribute name="bgcolor" value="red"/>
    <attribute name="defaultplacement" value="content"/>
    <blackbox name="content"
          x="10" y="10" width="${parent.width-20}" height="${parent.height-20}">

    </blackbox>
  </class>


  <redbox x="10" y="10" width="200" height="200">
    <view width="40" height="40" bgcolor="blue" />
  </redbox>

</canvas>

此示例应用程序定义了一个类blackbox和一个类redbox。黑盒子只是一个带有绿色子视图的黑盒子,其插图为10像素。

redbox使用blackbox类/标记作为子项,插入为20像素。 redbox的默认位置是指blackbox实例,blackbox的默认位置是指blackbox的绿色子视图,名称为“blackinner”。

然后代码创建一个redbox实例,其中包含蓝色视图(40x40像素)作为内容。正如您在应用程序的此屏幕截图中看到的那样,蓝色视图会自动正确放置在黑盒的绿色视图中。

Screenshot of example application with defaultplacement working

当讨论的更改发生时,应用程序的原始代码(我已将所有类放入canvas文件中以简化)在5.0(主干)中编译没有任何问题:

<canvas>

  <class name="myframe" extends="view">
    <attribute name="bgcolor" value="red"/>
    <attribute name="defaultplacement" value="insideview"/>
    <view x="5" y="5" width="${parent.width-10}" name='insideview'
          height="${parent.height-10}" 
          bgcolor="#FFFFCC"/>
  </class>


  <class name="answerMain" extends="view">
    <attribute name="defaultplacement" value="test"/>   
    <myframe name="test" width="220" height="20" />
  </class>

  <answerMain>
    <text> HI </text>
  </answerMain>

</canvas>

在这种情况下,OpenLaszlo编译器绝对不应该以异常退出,但不幸的是编译器在过去两年中没有得到很好的维护。