为了账号安全,请及时绑定邮箱和手机立即绑定

从 Vaadin 事件监听器更新组件

从 Vaadin 事件监听器更新组件

呼啦一阵风 2022-11-02 17:27:16
我想知道如何在从事件侦听器更改数据时更新 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 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

grid.getDataProvider().refreshAll();

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

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

refreshAll()将基本上重申数据提供者项目,重建行,并重新应用任何自定义列定义(即 styleGenerators 和其他基于状态的决策)。只要您使原始集合与您想要显示的内容保持同步,调用就refreshAll()应该有效。

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

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


查看完整回答
反对 回复 2022-11-02
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号