2017-06-04 55 views
0

大家好我的問題是我的網格不更新數據。在Vaadin的網格中更新數據

我有一個線程從數據庫中獲取新值,但是當我從獲取新值的集合中分配新的DataProvider時,網格不會更改任何內容。

例如,網格包含來自客戶端的訂單,如果存在新訂單,則每30秒一次線程搜索,然後y獲取ArrayList中的所有訂單,並在網格的DataProvider中設置新的ArrayList,但網格繼續具有與之前相同的值。

如何刷新網格中的數據而不刷新所有網頁?

對不起,我的英語

謝謝。

+0

您好,歡迎來SO。沒有看到代碼就很難從你的描述中找出答案。如果您可以與我們分享[sscce](http:// sscce。org),所以我們可以看到你是否使用推送或輪詢,vaadin版本,你可能在配置中忽略了什麼等。只是一個簡單的應用程序,沒有任何敏感數據,並基於一些隨機生成/模擬數據(沒有數據庫相互作用)。此外,在回覆某人的評論時,您可以使用@username,以便他們收到通知。 – Morfic

回答

2

投票

您可以設置瀏覽器來檢查服務器與給定的間隔更新。我已經添加了幾個代碼示例如何使用輪詢間隔。

例如,如果您希望瀏覽器每隔30秒更新,那麼你可以啓用輪詢是這樣的:

MyUI ui = getMyUi(); 
ui.setPollInterval(30000); 
if (ui.isPollListenerRegistered()) { 
    Registration r = ui.addPollListener(this::reloadFromDatabase); 
    ui.setPollRegistration(r); 
} 

設置PollInterval的重視大於-1使得瀏覽器調用服務器與給定的延遲。添加一個輪詢監聽器可以讓你注意到服務器上的這些檢查並從數據庫加載。

如果只有1個頁面需要刷新,然後添加導航監聽器,它可以將輪詢間隔設置回-1,以便其他頁面不會發送不必要的輪詢事件。

MyUI ui = getMyUi(); 
ui.setPollInterval(-1); 
if (ui.isPollListenerRegistered()) { 
    ui.getPollRegistration().unregister(); 
} 

Vaadin wiki中有一些文檔,但是如果您可以從數據庫讀取值,則不需要後臺線程。

https://vaadin.com/wiki?p_p_id=36

使用Vaadin推你可以更新後臺數據,然後要求只將更新刷新客戶端。這使您可以優化請求,因爲客戶端不會進行不必要的輪詢。您也可以通過單一請求從Web服務獲取數據,然後使用相同的數據更新所有客戶端。

可以Vaadin文檔閱讀更多:

https://vaadin.com/docs/-/part/framework/advanced/advanced-push.html

我推一個示例項目,演示如何使用單一重複後臺線程做更新數據,然後更新一格的內容與它。有超過短短的幾行代碼爲一個完整的推例子,所以你可以在這裏找到代碼:

https://github.com/m1kah/vaadin-grid-push

+0

謝謝我要測試它,我需要用線程來完成它,因爲我從WebService中提取數據。 –