編集
私の最初の質問に誰も答えていないので、私が目標を達成しようとした方法の既存の説明に加えて、私が達成しようとしていることの説明を追加する価値があると思います。
私の目的はDataGrid、コンテナのサイズの変更に応じてサイズを変更するを作成することです。これを行うのは難しいことではありませんが、追加の要件があります。それは、Panelウィジェットを上下に配置することDataGridです。これらの2つの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見出しを含む、が含まれています。これが問題の鍵であるかどうかはわかりませんが、'sにはオブジェクトが含まれており、;を実装していません。このメソッドは、子がを実装している場合にのみ、サイズ変更を子に送信します。DataGridScrollPanelScrollPanelDataGridHeaderPanelDataGrid$TableWidgetTableWidgetRequiresResizeScrollPanel#onResizeRequiresResize