编辑
由于没有人回答我最初的问题,我认为除了对我如何尝试实现目标的现有描述之外,还值得添加对我试图完成的目标的描述:
我的目标是创建一个DataGrid
将根据其容器大小的任何变化调整大小。这并不难做到,但我还有一个额外的要求,就是在;Panel
的上方和下方都有小部件。DataGrid
这两个Panel
小部件将包含大小固定的小部件(例如,一排按钮或文本输入小部件)。我的期望是 aHeaderPanel
非常适合这个,但这似乎不起作用(如下面的原始问题所示)。所以......我最初的问题(“为什么这不起作用”)的替代方案是:实现这个要求的最佳方法是什么?
我原来的问题:
我在 aDataGrid
的内容区域中有 a HeaderPanel
,但未显示其中的详细信息行DataGrid
(但是显示了DataGrid
列标题)。DataGrid
在 a的内容区域中使用 a 是否有问题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());
}
}
我试图跟踪执行,虽然我不确定,但当我更改浏览器窗口的大小并且“调整大小”请求被接收到时,看起来好像发生了以下情况DataGrid
(我已经跳过了一些“不重要”的方法):
DataGrid#onResize
HeaderPanel#forceLayout
ScrollPanel#onResize
该DataGrid
对象包含 a ,其中包含和 aHeaderPanel
的标题。我不知道这是否是问题的关键,但是's中的包含一个对象,并且没有实现; 该方法仅在子级实现时将调整大小发送给其子级。DataGrid
ScrollPanel
ScrollPanel
DataGrid
HeaderPanel
DataGrid$TableWidget
TableWidget
RequiresResize
ScrollPanel#onResize
RequiresResize