Использование 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%'/>
Другие вопросы по тегам