0

我最近开始在我的一个应用程序中使用 GWT。我对 UiBinder 的使用有疑问。如果我在我的类中声明了一个 @UiField 属性(在 .ui.xml 中也是如此),我是否可以在我在构造函数?

例如,如果我的 ui.xml 文件有一个 DockLayoutPanel,它的中心有一个 PlotWidget。

public class PlotWidget extends Composite {

    @UiField (provided = true)
    SimplePlot plot;

    public Constructor() {
        plot = new SimplePlot(someArgument1, someArgument2);
    }

    // some method
    public doSomething() {
        // Is this valid?
        plot = new SimplePlot(someArgument3, someArgument4);    
    }
}

该图是否仍然附加到 DockLayoutPanel 上?如果没有,我将如何实现需要创建上述新对象的功能?

任何指针将不胜感激。

4

2 回答 2

1

在这种情况下,我使用容器来更改小部件。

public class PlotWidget {

    @UiField
    SimplePanel plotContainer;

    public Constructor() {
        plotContainer.setWidget(new SimplePlot(someArgument1, someArgument2));
    }

    public doSomething() {
        plotContainer.setWidget(new SimplePlot(someArgument3, someArgument4));    
    }
}

但是如果 plot 字段上有事件处理程序(由@UiHandler annptation 提供),它将无法正常工作。

于 2012-07-23T10:47:01.077 回答
0

您的示例代码中缺少的是 ui binder create 调用,例如initWidget(uiBinder.createAndBindUi(this));. 这在初始化之后调用,在这种情况下,plotContainer构造函数中的 ui 字段。如果您将新实例重新分配给新实例,SimplePlot则不会将其附加到 DockLayoutPanel,并且如果您确实以某种方式替换了现有实例,则还需要重新附加处理程序。

一个解决方案可能是创建一个新的 SimplePlot 实例,或者不是创建一个新的 SimplePlot 实例,而是通过 SimplePlot 上的方法调用来设置参数。但是,如果创建 SimplePlot 的唯一方法是通过构造函数,如果您无法控制实现,则可以创建一个单独的 uibinder 类/小部件来创建 SimplePlot,它创建 SimplePlot 并附加处理程序并setWidget通过如 sinicyn 所描述的 PlotWidget。

于 2012-07-23T11:28:33.553 回答