Использование DataGrid в HeaderPanel
редактировать
Поскольку никто не ответил на мой первоначальный вопрос, я думаю, что стоит добавить описание того, что я пытаюсь достичь, в дополнение к существующему описанию того, как я пытался достичь своей цели:
Моя цель - создать 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());
}
}
Я попытался отследить выполнение, и, хотя я не уверен, похоже, что следующее происходит, когда я изменяю размер окна браузера, и запрос "изменить размер" получен DataGrid
(Я пропустил некоторые "неважные" методы):
DataGrid#onResize
HeaderPanel#forceLayout
ScrollPanel#onResize
DataGrid
объект содержит HeaderPanel
, который содержит заголовки для DataGrid
и ScrollPanel
, Я не знаю, является ли это ключом к проблеме, но ScrollPanel
в DataGrid
"s HeaderPanel
содержит DataGrid$TableWidget
объект и TableWidget
не реализует RequiresResize
; ScrollPanel#onResize
метод отправляет изменение размера только своему дочернему элементу, если дочерний элемент реализует RequiresResize
,
1 ответ
Tables and Frames
В разделе Руководства разработчика GWT ясно, что мне нужно было использовать ширину / высоту 100% для DataGrid! Вот так:
<c:DataGrid
ui:field='dataGrid'
width='100%'
height='100%'/>