亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 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 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號