編集
私の最初の質問に誰も答えていないので、私が目標を達成しようとした方法の既存の説明に加えて、私が達成しようとしていることの説明を追加する価値があると思います。
私の目的は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にはオブジェクトが含まれており、;を実装していません。このメソッドは、子がを実装している場合にのみ、サイズ変更を子に送信します。DataGrid
ScrollPanel
ScrollPanel
DataGrid
HeaderPanel
DataGrid$TableWidget
TableWidget
RequiresResize
ScrollPanel#onResize
RequiresResize