从 Vaadin 事件侦听器更新组件
Updating component from Vaadin event listener
我想知道如何在更改来自事件侦听器的数据时更新 Vaadin 中的组件。有问题的代码如下所示:
Set<Long> identifiers = new LinkedHashSet<>();
Grid<Long> grid = new Grid<>(Long.class);
grid.addColumn((ValueProvider<Long, Long>) value -> value);
grid.setDataProvider(new ListDataProvider<>(identifiers));
TextField identifier = new TextField();
identifier.getElement().addEventListener("keyup", event -> {
String value = event.getEventData().getString("element.value");
if (value != null && value.length() > 0) {
try {
identifiers.add(Long.parseLong(value));
identifier.clear();
} catch (NumberFormatException e) {
Notification.show("Not a valid identifier: " + value);
}
}
}).addEventData("element.value").setFilter("event.key == 'Enter'");
事件如我所料被调度,但网格没有在用户视图中重新呈现。我如何告诉 Vaadin 网格需要从事件处理程序重新呈现?
重新呈现网格是通过刷新 DataProvider 完成的。您可以这样做:
grid.getDataProvider().refreshAll();
编辑:我的解释是基于错误的假设
ListDataProvider
不会复制提供给它的集合,因此更改原始项目集合会影响数据提供者。但它不会自动重新渲染,你仍然需要调用 refreshAll()
.
refreshAll()
基本上会重复数据提供者的项目,重建行,并重新应用任何自定义列定义(即 styleGenerators 和其他基于状态的决策)。只要您保持原始集合与您要显示的内容保持同步,调用 refreshAll()
应该可以。
如果您想完全更改显示的项目列表,您可以从原始集合 (identifiers
) 中删除所有项目并向其中添加新项目,然后全部刷新,或者您可以简单地设置具有新项目集合的新数据提供者。
(这条线也可以解决 OP 的问题,但如果 refreshAll 足够的话应该避免。)
grid.setDataProvider(new ListDataProvider<>(otherIdentifiers));
我想知道如何在更改来自事件侦听器的数据时更新 Vaadin 中的组件。有问题的代码如下所示:
Set<Long> identifiers = new LinkedHashSet<>();
Grid<Long> grid = new Grid<>(Long.class);
grid.addColumn((ValueProvider<Long, Long>) value -> value);
grid.setDataProvider(new ListDataProvider<>(identifiers));
TextField identifier = new TextField();
identifier.getElement().addEventListener("keyup", event -> {
String value = event.getEventData().getString("element.value");
if (value != null && value.length() > 0) {
try {
identifiers.add(Long.parseLong(value));
identifier.clear();
} catch (NumberFormatException e) {
Notification.show("Not a valid identifier: " + value);
}
}
}).addEventData("element.value").setFilter("event.key == 'Enter'");
事件如我所料被调度,但网格没有在用户视图中重新呈现。我如何告诉 Vaadin 网格需要从事件处理程序重新呈现?
重新呈现网格是通过刷新 DataProvider 完成的。您可以这样做:
grid.getDataProvider().refreshAll();
编辑:我的解释是基于错误的假设
ListDataProvider
不会复制提供给它的集合,因此更改原始项目集合会影响数据提供者。但它不会自动重新渲染,你仍然需要调用 refreshAll()
.
refreshAll()
基本上会重复数据提供者的项目,重建行,并重新应用任何自定义列定义(即 styleGenerators 和其他基于状态的决策)。只要您保持原始集合与您要显示的内容保持同步,调用 refreshAll()
应该可以。
如果您想完全更改显示的项目列表,您可以从原始集合 (identifiers
) 中删除所有项目并向其中添加新项目,然后全部刷新,或者您可以简单地设置具有新项目集合的新数据提供者。
(这条线也可以解决 OP 的问题,但如果 refreshAll 足够的话应该避免。)
grid.setDataProvider(new ListDataProvider<>(otherIdentifiers));