2013-10-08 38 views
2

我想要在GWT中獲得UI Binder的掛件。試圖讓GWT DataGrid在UiBinder中工作

到目前爲止,我有一個基本的應用程序來顯示帶有一些示例數據的DataGrid,並且它可以在傳統的GWT和UIBinder之間輕鬆切換。它在傳統的GWT中正常工作,但不在UiBinder中正常工作。

這裏的主要入口點類:

public class Main implements EntryPoint { 

    public void onModuleLoad() { 

     uiBinder(); //call either uiBinder() or gwt() here 
    } 

    /* Use UiBinder to display grid */ 
    public void uiBinder() { 
     HelloWorld hello = new HelloWorld(); 
     RootPanel.get("myid").add(hello); 
    } 

    /* Use traditional GWT to display grid */ 
    public void gwt() { 
     DataGrid<Contact> grid = new DataGrid<Contact>(); 
     GridInitializer.init(grid); 
     RootLayoutPanel.get().add(grid); 
    } 

} 

下面是由UiBinder的使用的HelloWorld.java:

public class HelloWorld extends Composite { 

    interface MyUiBinder extends UiBinder<Widget, HelloWorld> {} 
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); 

    @UiField DataGrid<Contact> grid; 

    public HelloWorld() {    
     GridInitializer.init(grid); 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
} 

的GridInitializer類建立網格列和樣本數據。我沒有錯,因爲如果我使用傳統的GWT,它會正確渲染。

這裏是HelloWorld.ui.xml:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    xmlns:g='urn:import:com.google.gwt.user.client.ui' 
    xmlns:c="urn:import:com.google.gwt.user.cellview.client"> 

    <g:DockLayoutPanel unit="EM"> 
    <g:center> 
     <c:DataGrid ui:field='grid' /> 
    </g:center> 
    </g:DockLayoutPanel> 

</ui:UiBinder> 

如果我使用UI活頁夾,沒有顯示在所有。我很茫然。有什麼建議麼?

+0

您是否期待UiBinder爲您創建網格還是您自己創建網格? (即你的網格有一個零構造參數) – enrybo

+0

另外,你有沒有嘗試給'DataGrid'一個明確的大小?我知道整個'ProvideSize'的事情,但我發現它並不總是工作。 – enrybo

回答

3

DataGrid(一個RequireSize窗口小部件)必須被添加到(必須是子窗口)ProvidesResize面板/窗口小部件,或者它必須是明確的大小。因此,您必須設置DataGrid或其父組件的大小。此外,它要求您的應用程序使用RootLayoutPanel

0

你有沒有嘗試換換這兩條線?

GridInitializer.init(grid); 
initWidget(uiBinder.createAndBindUi(this)); 

initWidget(uiBinder.createAndBindUi(this)); 
GridInitializer.init(grid); 

的initWidget創建網格。請參閱http://www.gwtproject.org/doc/latest/DevGuideUiBinder.html#Hello_World

此外,您將它添加到您的uiBinder()方法中的RootPanel而非RootLayoutPanel。你確定myid存在嗎? DockLayoutPanel有點矯枉過正,使用LayoutPanel。

+0

剛剛嘗試了您的建議。沒有運氣:(此外,它在DockLayoutPanel內部的原因是因爲AFAIK DataGrid需要是一個實現ProvideResize的小部件的孩子 – NickJ

+0

您現在可以只使用普通的LayoutPanel – tom

+0

您將它添加到RootPanel而不是RootLayoutPanel中你的uiBinder()方法,並且你確定myid存在嗎?用和GWT相同的方式添加它:RootLayoutPanel.get()。add(grid); – tom