4

我正在尝试在 GWT 中掌握 UI Binder 的窍门。

到目前为止,我有一个基本的应用程序来显示带有一些示例数据的 DataGrid,并且可以在传统的 GWT 和 UIBinder 之间轻松切换。它在传统的 GWT 中正常工作,但在 UiBinder 中不能正常工作。

这是主要的 EntryPoint 类:

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 Binder,则根本不会显示任何内容。我不知所措。有什么建议么?

4

2 回答 2

4

DataGrid(一个RequireSize小部件)必须添加到(必须是其子级)ProvidesResize面板/小部件,或者必须明确调整其大小。

因此,您必须设置 DataGrid 或其父组件的大小。此外,它要求您的应用程序使用RootLayoutPanel

于 2013-10-09T05:39:43.283 回答
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。

于 2013-10-08T16:19:45.860 回答