2017-06-04 70 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中提取数据。 –