带有参数的GWT UiConstructor,类没有合适的setter方法

时间:2011-03-07 18:03:08

标签: xml gwt layout constructor uibinder

我想实现一个自定义TabLayoutPanel,它会在添加小部件时自动设置标签本身(使用自定义操作,例如关闭标签等)。

我创建了CustomTabPanel.ui.xml以及CustomTabPanel.java。 UI设计只是嵌入了一个TabLayoutPanel,代码部分公开了我需要的一些功能。 我还有一个构造函数,它接受与TabLayoutPanel相同的2个参数,我想在UI设计模式下传递,就像我使用普通的TabLayoutPanel一样。 看起来像这样

public class CustomTabPanel extends Composite{
    /* ... here all the uiBinder things
       already written by my eclipse plugin */

    @UiField(provided=true)
    TabLayoutPanel tabPanel;

    public @UiConstructor CustomTabPanel(double barHeight, Unit barUnit){
        tabPanel = new TabLayoutPanl(barHeight, barUnit);
        initWidget(uiBinder.creatAndBindUi(this));
    }

我在另一个.ui.xml文件中使用自定义复合小部件 但是,当我在浏览器中启动并测试Web应用程序时,出现以下错误:

  

类CustomTabPanel没有合适的setBarUnit()方法。    元素< my:ClosableTabPanel barHeight ='2'barUnit ='EM'ui:field ='closablepanel'>

我按照http://code.google.com/intl/fr/webtoolkit/doc/latest/DevGuideUiBinder.html#Using_a_widget上的说明进行操作。我想我错过了一些东西,但我找不到它是什么。

我之前尝试通过创建派生class ExtendedTabLayoutPanel extends TabLayoutPanel{...}并使用参数实现构造函数来使用继承。这在运行时给了我另一个错误:

  

第xx行:类型不匹配:无法从TabLayoutPanel转换为ExtendedTabLayoutPanel

希望我足够清楚......快读你!

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。事实证明,论证的顺序在某种程度上很重要;见http://code.google.com/p/google-web-toolkit/issues/detail?id=5272

如果订单正确,则无需担心转换枚举。我现在有这个:

public @UiConstructor FancyTabLayoutPanel(Unit barUnit, double barHeight) {...}

...在我的.ui.xml文件中:

<v:FancyTabLayoutPanel barUnit="EM" barHeight="2.0"></v:FancyTabLayoutPanel>

我想知道在不同的部署中所需的参数顺序是否健壮?

答案 1 :(得分:0)

您的问题可能与com.google.gwt.dom.client.Style.Unit是枚举这一事实有关。解决问题的另一种方法是将barUnit更改为string类型,然后使用Unit.valueOf(barUnit)来检索相应的枚举值。这也使您能够正确地错误检查传递的单位名称。

至于UiBinder中继承的问题,实际上是known issue已经修补但尚未正式添加到GWT。