大家好,我的问题是我的网格不更新数据。
我有一个从数据库获取新值的线程,但是当我从获取新值的集合中分配新的 DataProvider 时,网格不会更改任何内容。
例如,网格包含来自客户端的订单,每 30 秒一个线程搜索是否有新订单可用,然后获取 ArrayList 中的所有订单并在网格的 DataProvider 中设置新的 ArrayList,但网格继续具有与之前的值相同。
如何在不刷新所有网页的情况下刷新网格中的数据?
对不起我的英语
谢谢。
最佳答案
投票
您可以设置浏览器以给定的时间间隔检查服务器的更新。我添加了几个代码示例,如何为此使用轮询间隔。
例如,如果您希望浏览器每 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 Push,您可以在后台更新数据,然后仅请求应更新的客户端进行刷新。这允许您优化请求,因为客户端不会进行不必要的轮询。您还可以通过单个请求从 Web 服务获取数据,然后使用相同的数据更新所有客户端。
您可以在 Vaadin 文档中阅读更多内容:
https://vaadin.com/docs/-/part/framework/advanced/advanced-push.html
我推送了一个示例项目,该项目展示了如何使用单个重复后台线程来更新数据,然后用它更新网格的内容。完整的推送示例不仅仅是几行代码,因此您可以在此处找到代码:
关于java - 更新 Vaadin 网格中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44352911/