РедактироватьИспользование DataGrid в HeaderPanel
Поскольку никто не ответил на мой оригинальный вопрос, я думаю, что стоит добавить описание , что я пытающийся совершить, в дополнение к существующему описанию how Я постарался достичь своей цели:
Моя цель - создать 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
HeaderPanel
содержит объект DataGrid$TableWidget
, а TableWidget
не реализует RequiresResize
; метод ScrollPanel#onResize
отправляет только размер его дочернему элементу, если ребенок реализует RequiresResize
.