2012-06-05 20 views
1

我正在使用GWT並且有一個按鈕,點擊後應過濾顯示在我的CellTable中的數據,然後隱藏一些列。在GWT中執行事件塊後的調用函數

filterButton.addClickHandler(new ClickHandler() { 
    public void onClick (ClickEvent event) { 
     //some working code here to get the minimum and maximum 
     filter(min, max); 
     hideCols(); 
    } 
}); 

我的問題是在這裏。我發現(從https://developers.google.com/web-toolkit/doc/latest/DevGuideUiCellWidgets#celllist)ListDataProvider將Celltable綁定到我的列表,任何對列表的更改都會反映在視圖中。視圖在當前事件塊結束時更新,這會導致我的問題。我在當前事件塊中調用了hideCols(),它隱藏了列,但據我所知,在退出塊並重新繪製列時更新了視圖。在ListDataProvider完全完成後,有沒有辦法讓hideCols()運行?

filter(int min, int max) { 
    for (SiteInfo site : displayedList) 
     if (site.num_zones >= min && site.num_zones <= max) 
      filteredList.add(site); 
    dataProvider.getList().clear(); 
    dataProvider.getList().addAll(filteredList); 
    siteTable.setRowCount(filteredList.size()); 
} 

最後這裏是hideCols()函數。我知道它正常工作,因爲我在代碼中的其他地方稱其爲成功。第一行隱藏列標題,第二行負責處理各列的行。

private native void hideCols()/*-{ 
    $wnd.jQuery("span.toHide").parent().hide(); 
    $wnd.jQuery(".toHide").hide(); 
}-*/; 

任何幫助將不勝感激。

回答

1

您可以使用flush()同步重繪。

但IMO應解決您的hideCols:使用addColumnStyleName添加類visibility: collapse,或交替remove the colsCellTable

並回答你的問題,你可以使用Scheduler.get().scheduleFinally(或scheduleDeferred如果最後是不夠晚)。

+0

感謝您的回覆。 我最初使用'refresh()',但列回來了。 flush()有什麼不同? 我試着向你提到的列添加樣式,但似乎沒有發生。我能夠從桌子上移除柱子,但如果我再次需要它們,則無法將它們還原。 我沒有嘗試使用'Scheduler.get()。scheduleDeferred'。 我現在最終做的是創建第二個表格,只顯示我想要隱藏的列,並根據需要切換其可見性。這不是一個很好的解決方案,但它的工作。 –

+0

我對我的答案做了一些更正,併爲該方法添加了javadocs的鏈接。這說明我的意思是'CellTable#flush()'而不是'ListDataProvider#flush()',例如。太加入你的列,使用'insertColumn()';這應該會觸發重繪,但是您可以調用'CellTable'上的'redraw()'來確保。 –