java - 从 Vaadin 事件监听器更新组件

标签 java vaadin vaadin10

我想知道如何在更改来自事件监听器的数据时更新 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'");

事件按照我的预期进行调度,但网格未在用户 View 中重新呈现。我如何告诉 Vaadin 网格需要从事件处理程序重新呈现?

最佳答案

重新渲染网格是通过刷新 DataProvider 来完成的。你可以这样做:

grid.getDataProvider().refreshAll();

编辑:我的解释是基于错误的假设

ListDataProvider 不会复制提供给它的集合,因此更改原始项目集合将影响数据提供者。但它不会自动重新渲染自己,您仍然必须调用 refreshAll()

refreshAll() 基本上会重复数据提供程序项、重建行并重新应用任何自定义列定义(即样式生成器和其他基于状态的决策)。只要您保持原始集合与您要显示的内容保持同步,调用 refreshAll() 就应该有效。

如果你想完全改变显示的项目列表,你可以从原始集合(identifiers)中删除所有项目并向它添加新项目,然后刷新所有,或者你可以然后简单地使用新的项目集合设置新的数据提供者。
(这条线也可以解决 OP 的问题,但如果 refreshAll 就足够了,应该避免。)

grid.setDataProvider(new ListDataProvider<>(otherIdentifiers));

关于java - 从 Vaadin 事件监听器更新组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55955449/

相关文章:

java - 从 Spring Boot 1.5 迁移到 2,多个数据源上出现错误

java - 是否有可以释放其大小的 Java 容器或集合?

vaadin:为什么不建议使用菜单/菜单栏进行导航?

java - 如何将 maven 生成的 vaadin 项目集成到 eclipse vaadin 插件中?

java - 如何防止Vaadin 10长时间处理时出现连接松动?

java - Vaadin 10 Grid 添加自定义图像图标

Vaadin Flow Grid 没有高度

javax.naming.NamingException : Lookup failed - Intellij Idea

java - OSGi - 如何使用 FUSE ESB 添加 JVM 参数?

java - 无法在 VerticalSplitPanel 中添加组件