0

编辑

由于没有人回答我最初的问题,我认为除了对我如何尝试实现目标的现有描述之外,还值得添加对试图完成的目标的描述:

我的目标是创建一个DataGrid将根据其容器大小的任何变化调整大小。这并不难做到,但我还有一个额外的要求,就是在;Panel的上方和下方都有小部件。DataGrid这两个Panel小部件将包含大小固定的小部件(例如,一排按钮或文本输入小部件)。我的期望是 aHeaderPanel非常适合这个,但这似乎不起作用(如下面的原始问题所示)。所以......我最初的问题(“为什么这不起作用”)的替代方案是:实现这个要求的最佳方法是什么?

我原来的问题:

我在 aDataGrid的内容区域中有 a HeaderPanel,但未显示其中的详细信息行DataGrid(但是显示了DataGrid列标题)。DataGrid在 a的内容区域中使用 a 是否有问题HeaderPanel?或者这是对小部件的简单滥用?我正在添加HeaderPanelRootLayoutPanel它应该提供必要的调整大小通知(我认为)。这是我的 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());
}

}

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

  DataGrid#onResize
  HeaderPanel#forceLayout
  ScrollPanel#onResize

DataGrid对象包含 a ,其中包含和 aHeaderPanel的标题。我不知道这是否是问题的关键,但是's中的包含一个对象,并且没有实现; 该方法仅在子级实现时将调整大小发送给其子级。DataGridScrollPanelScrollPanelDataGridHeaderPanelDataGrid$TableWidgetTableWidgetRequiresResizeScrollPanel#onResizeRequiresResize

4

1 回答 1

1

GWT 开发人员指南部分Tables and Frames清楚地表明我只需要为 DataGrid 使用 100% 的宽度/高度!像这样:

  <c:DataGrid
    ui:field='dataGrid'
    width='100%'
    height='100%'/>
于 2013-04-12T18:17:20.090 回答