GWT UiBinder - 为UiField引用分配新对象

时间:2012-07-23 10:37:21

标签: java gwt uibinder

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

任何指针都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

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

public class PlotWidget {

    @UiField
    SimplePanel plotContainer;

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

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

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

答案 1 :(得分:0)

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

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