GWT UiBinder-将新对象分配给UiField引用



我最近开始在我的一个应用程序中使用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上?如果没有,我将如何实现我需要创建如上所述的新对象的功能?

任何建议都将不胜感激。

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

public class PlotWidget {
    @UiField
    SimplePanel plotContainer;
    public Constructor() {
        plotContainer.setWidget(new SimplePlot(someArgument1, someArgument2));
    }
    public doSomething() {
        plotContainer.setWidget(new SimplePlot(someArgument3, someArgument4));    
    }
}

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

示例代码中缺少的是ui绑定器创建调用,类似于initWidget(uiBinder.createAndBindUi(this));。这是在初始化构造函数中的ui字段plotContainer之后调用的。如果将新实例重新分配给SimplePlot,则新实例将不会附加到DockLayoutPanel,如果以某种方式替换了现有实例,则还需要重新附加处理程序。

一个解决方案可以是创建一个新的SimplePlot实例,也可以是通过对SimplePlot的方法调用来设置参数。但是,如果创建SimplePlot的唯一方法是通过构造函数,如果您对实现没有控制权,则可以创建一个单独的uibinder类/小部件来创建SimplePlot,该类用于创建SimplePlot和附加处理程序,并通过PlotWidget上的setWidget设置新的小部件,如sincyn所述。

最新更新