2013-12-16 51 views
1

我正在構建一個GWT應用程序。GWT DataGrid不可見(UIBinder和LazyPanel)

在這個應用程序中,我有大量的DataGrid實現顯示從服務器檢索到的數據。在一個面板中,我有一個TabLayoutPanel,每個選項卡上都有一個DataGrid。

我試圖延遲加載DataGrids時,父標籤變得可見。

這裏是ui.xml:

<g:TabLayoutPanel width="800px" height="450px" barUnit='EM' barHeight='3'> 
<g:tab> 
    <g:header size='7'><b>Volunteer Assignments</b></g:header> 
    <grid:VolunteerAssignmentGrid/> 
</g:tab> 
<g:tab> 
    <g:header size='7'><b>Volunteer Details</b></g:header> 
    <g:LazyPanel ui:field="lazyDetails"> 
    <grid:VolunteerFieldsGrid/>  
    </g:LazyPanel> 
</g:tab> 
</g:TabLayoutPanel> 

在上面的代碼,VolunteerAssignmentGrid和VolunteerFieldsGrid是數據網格的子類。

VolunteerAssignmentGrid立即可見,數據顯示OK。

但是,下一個選項卡上的VolunteerFieldsGrid根本不顯示。

奇怪的是,它請求數據在正確的時間(當我點擊另一個標籤),並且服務器響應是正確的。就好像表格不可見一樣。

任何想法爲什麼第二個DataGrid不可見?

編輯:

的UiBinder的類:

public class VolunteerDetailsPanel extends DialogBox { 

interface Binder extends UiBinder<Widget, VolunteerDetailsPanel> {} 
private static final Binder binder = GWT.create(Binder.class); 

@UiField LazyPanel lazyDetails; 
private Record volunteerRecord; 
private String fullName; 
private String volunteerId; 

public VolunteerDetailsPanel(Record record) { 
    this.volunteerRecord = record; 
    fullName = volunteerRecord.getValue("forename")+" "+volunteerRecord.getValue("surname"); 
    volunteerId = volunteerRecord.getValue("id"); 
    setText(fullName); 
} 

public void initComponent() { 
    setWidget(binder.createAndBindUi(this)); 
} 

@UiFactory VolunteerAssignmentGrid createAssignmentGrid() { 
    return new VolunteerAssignmentGrid(volunteerId, fullName); 
} 

@UiFactory VolunteerFieldsGrid createFieldsGrid() { 
    return new VolunteerFieldsGrid(volunteerId); 
} 


} 

按照要求,也是VolunteerFieldsGrid類。它擴展ListGrid(礦山之一,但太長,張貼在這裏,我的所有其他網格擴展它,併爲OK),進而擴展GWT的DataGrid中:

public class VolunteerFieldsGrid extends ListGrid { 

public VolunteerFieldsGrid(String volunteerId) { 

    super(100, "name", false); 
    setWidth("100%"); 

    ListGridColumn<?>[] columns = new ListGridColumn<?>[] { 
     new FieldNameColumn("Field", "name").width(75), 
     new TextColumn("Value", "value").width(300) 
    }; 
    setColumns(columns); 

    ListGridDataProvider data = ListGridDataProvider.getInstance("field", 
      "/volunteer/"+volunteerId, "name", false); 

    setDataProvider(data); 
} 

} 
+0

你能顯示uibinder模板的所有者和VolunteerFieldsGrid嗎? – klarki

+0

根據要求添加的額外信息 – NickJ

回答

0

你必須註冊一個處理器在SelectionEventTabLayoutPanel,這將撥打LazyPanel.setVisible(true)。在UiBinder中試試這樣的:

@UiHandler("yourTabPanelUiField") 
void onSelectionEvent(SelectionEvent event) { 
    //for extra functionality check if EventTarget equals the correct tab 
    lazyDetails.setVisible(true); 
} 
+0

不幸的是,這不起作用。我開始懷疑GWT錯誤,因爲如果我在LazyPanel下嵌套另一個TagLayoutPanel並顯示我的Grid,它確實可行! – NickJ