2012-07-23 27 views
0

我最近開始在我的一個應用程序中使用GWT。我對使用UiBinder有疑問。如果我在我的類中聲明瞭@UiField屬性(類似地在.ui.xml中),我可以創建一個新類型的對象並將其分配給同一個引用,在創建它之後構造函數?GWT UiBinder - 將新對象分配給UiField參考

例如,如果我的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與否?如果沒有,我將如何實現我需要創建上述新對象的功能?

任何指針將不勝感激。

回答

0

示例代碼中缺少的是UI綁定器創建調用,如initWidget(uiBinder.createAndBindUi(this));。這是在初始化之後調用的,在這種情況下,構造函數中的ui字段plotContainer。如果您要將新實例重新分配給SimplePlot,則新實例將不會附加到DockLayoutPanel,如果您以某種方式替換了現有實例,則還需要重新附加處理程序。

一個解決方案可以是或不是創建一個新的SimplePlot實例,通過SimplePlot上的方法調用來設置參數。但是,如果創建SimplePlot的唯一方法是通過構造函數,如果您無法控制實現,則可以創建一個單獨的uibinder類/小部件來創建SimplePlot,該SimplePlot創建SimplePlot並附加處理程序,並通過setWidget設置該新小部件作爲sinicyn描述的PlotWidget。

+0

對不完整的代碼抱歉,但我在原始應用程序中使用了'initWidget'方法(整個代碼未在此粘貼)。感謝您確認它未附加到面板上。不知何故,gflot SimplePlot重繪對我來說不起作用,因此需要創建一個新的實例。我使用的解決方法是清除docklayoutpanel並將新創建的SimplePlot設置爲'panel.add(plot)'並且它工作到目前爲止。 – Swapnil 2012-07-23 11:36:54

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提供),它將無法正常工作。

+0

這是否意味着我提到的上述代碼有問題?我想最終整合事件處理程序,所以我懷疑這會有所幫助。 – Swapnil 2012-07-23 11:10:25