修改
由于没有人回复我的原始问题,我认为除了如何的现有描述之外,还有必要添加我想要完成的的描述。我试图实现我的目标:
我的目标是创建一个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
,其中包含HeaderPanel
和DataGrid
的标题。我不知道这是否是问题的关键,但ScrollPanel
ScrollPanel
DataGrid
中的HeaderPanel
包含DataGrid$TableWidget
个对象,TableWidget
没有实现RequiresResize
;如果子项实现ScrollPanel#onResize
,RequiresResize
方法仅将调整大小发送给其子项。
答案 0 :(得分:1)
GWT Developer's Guide的Tables and Frames
部分清楚地表明我只需要为DataGrid使用100%的宽度/高度!像这样:
<c:DataGrid
ui:field='dataGrid'
width='100%'
height='100%'/>