在HeaderPanel中使用DataGrid

时间:2013-03-06 20:59:52

标签: gwt uibinder

修改

由于没有人回复我的原始问题,我认为除了如何的现有描述之外,还有必要添加我想要完成的的描述。我试图实现我的目标:

我的目标是创建一个DataGrid,根据容器大小的任何变化调整大小。这并不难做到,但我还有一个额外的要求,即Panel上方和下方有DataGrid小部件;这两个Panel小部件将包含大小固定的小部件(例如,一行按钮或文本输入小部件)。我的期望是HeaderPanel对此非常完美,但这似乎不起作用(可以在我原来的问题中看到,如下)。所以......我原来的问题的替代方案(“为什么不起作用”)是:实现这一要求的最佳方式是什么?

我原来的问题:

我在DataGrid的内容区域中有HeaderPanel,但DataGrid中的详细信息行未显示(DataGrid列标题显示,然而)。在DataGrid的内容区域中使用HeaderPanel是否存在问题?或者这是对小部件的简单滥用?我将HeaderPanel添加到RootLayoutPanel,这应该提供必要的调整大小通知(我认为)。这是我的UiBinder代码:

<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:HeaderPanel>
    <g:SimplePanel/>
    <g:ResizeLayoutPanel>
      <c:DataGrid ui:field='dataGrid'/>
    </g:ResizeLayoutPanel>
    <g:HorizontalPanel>
      <g:Button
        ui:field='addRecordButton'
        text='Add Record'/>
      <g:Label ui:field='numberOfRecordsLabel'/>
    </g:HorizontalPanel>
  </g:HeaderPanel>
</ui:UiBinder>

这是Java代码:

public class TempGWT implements EntryPoint {

@UiField
Button                    addRecordButton;
@UiField
DataGrid<Record>          dataGrid;
@UiField
Label                     numberOfRecordsLabel;

private ArrayList<Record> _recordList;

interface TempGWTBinder extends UiBinder<Widget, TempGWT> {
}

private static class Record {
private String _field1;
}

@Override
public void onModuleLoad() {
  _recordList = new ArrayList<Record>();
  TempGWTBinder binder = GWT.create(TempGWTBinder.class);
  Widget widget = binder.createAndBindUi(this);
  Column<Record, String> field1Column = new Column<Record, String>(new TextInputCell()) {
    @Override
    public String getValue(final Record record) {
      return record._field1;
    }
  };
  dataGrid.addColumn(field1Column, "Field 1");
  RootLayoutPanel.get().add(widget);
}

@UiHandler("addRecordButton")
public void onAddRecordButtonClick(final ClickEvent event) {
  Record record = new Record();
  record._field1 = "Record " + (_recordList.size() + 1);
  _recordList.add(record);
  dataGrid.setRowData(_recordList);
  numberOfRecordsLabel.setText("Records:" + _recordList.size());
}

}

我试图跟踪执行情况,虽然我不确定,当我更改浏览器窗口的大小并且{{1}收到“调整大小”请求时,看起来好像发生了以下情况(我已经跳过了一些“不重要”的方法):

DataGrid

DataGrid#onResize HeaderPanel#forceLayout ScrollPanel#onResize 对象包含DataGrid,其中包含HeaderPanelDataGrid的标题。我不知道这是否是问题的关键,但ScrollPanel ScrollPanel DataGrid中的HeaderPanel包含DataGrid$TableWidget个对象,TableWidget没有实现RequiresResize;如果子项实现ScrollPanel#onResizeRequiresResize方法仅将调整大小发送给其子项。

1 个答案:

答案 0 :(得分:1)

GWT Developer's GuideTables and Frames部分清楚地表明我只需要为DataGrid使用100%的宽度/高度!像这样:

  <c:DataGrid
    ui:field='dataGrid'
    width='100%'
    height='100%'/>