从Vaadin事件侦听器更新组件

时间:2019-05-02 15:13:28

标签: 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'");

该事件的分发与我期望的一样,但是未在用户视图中重新呈现网格。如何告诉Vaadin网格需要从事件处理程序中重新渲染?

1 个答案:

答案 0 :(得分:3)

通过刷新DataProvider完成重新渲染网格。您可以这样操作:

ItemsControl

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

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

refreshAll()基本上将重申数据提供程序项,重建行并重新应用任何自定义列定义(即styleGenerators和其他基于状态的决策)。只要您使原始收藏集与您要显示的内容保持最新,调用refreshAll()就可以了。

如果您想完全更改显示的项目列表,则可以从原始集合(refreshAll())中删除所有项目,然后向其中添加新项目,然后刷新所有项目,或者可以简单地设置一个新项目具有新项目集合的数据提供者。
(此行也可以解决OP的问题,但如果refreshAll足够,则应避免。)

identifiers