我在视图中有一个Vaadin表。有一个按钮可以在表格中创建一个新行,打开一个子窗口,允许您指定新项目并创建它。
一旦创建,通知就会告诉您它已成功创建,此时我想重新加载当前的UI(这是一个View),以便新元素可见(如果分页会使其可见)。
我在关闭子窗口之前尝试了UI.getCurrent().markAsDirty();
,但它不起作用。
答案 0 :(得分:1)
最后,我利用Table方法addItem解决了这个问题。这是有效的,但必须有更优雅的解决方案。
答案 1 :(得分:0)
通过将您使用的主要布局更改为静态,可以自动重新加载vaadin表。
答案 2 :(得分:0)
我刚遇到类似的问题。我有一个由sql支持的表,以及一个用于编辑详细信息+删除的子窗口。无论在子窗口还是表格上都有markAsDirty(),setImmediate(true),表格都没有更新。
解决方案是从表中获取SQLContainer,并在其上调用refresh:
Table table = new Table("Contact items");
... // add dataSource, headers etc, and after several calls:
@Override
public void windowClose(CloseEvent e) {
SQLContainer c = (SQLContainer)table.getContainerDataSource();
c.refresh();
}
答案 3 :(得分:0)
如果您只想刷新表,可以使用表容器数据源通过删除所有项目并再次添加来执行此刷新,如下面的代码所示:
List<Item> items = new ArrayList<>();
for(Object object : table.getContainerDataSouce().getItemIds()){
items.add(table.getContainerDataSource().getItem(object));
}
table.getContainerDataSource().removeAllItems();
table.removeAllItems();
items.add(<yourItem>);
for(Item item : items){
table.getContainerDataSource().addItem(item);
}
答案 4 :(得分:0)
我一直在努力解决这个问题。我使用了一个由我扩展的PagedTable ...并添加了这样的方法:
Object[] visibleColumns = getVisibleColumns();
getDataSource().refresh();
setContainerDataSource(getContainerDataSource());
setVisibleColumns(visibleColumns);
refreshRowCache();
通过这种方式,我可以使用弹出窗口将新项目插入到表格中,然后使用新行刷新表格。(还有一些额外的代码可以在哪里查看新记录)