我想知道如何在從事件偵聽器更改數據時更新 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));
添加回答
舉報
0/150
提交
取消