2013-03-06 4 views
0

РедактироватьИспользование 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 в DataGridHeaderPanel содержит объект DataGrid$TableWidget, а TableWidget не реализует RequiresResize; метод ScrollPanel#onResize отправляет только размер его дочернему элементу, если ребенок реализует RequiresResize.

ответ

1

Tables and Frames раздел GWT Developer's Guide дает понять, что мне просто нужно использовать ширину/высоту 100% для DataGrid! Например:

<c:DataGrid 
    ui:field='dataGrid' 
    width='100%' 
    height='100%'/>