Vaadin 21切换Locale时如何重新翻译Grid列经ItemLabelGenerator生成的内容
Vaadin 21 Grid列国际化切换后刷新方案
你可以根据业务场景选择以下两种实现方案:
方案一:全量刷新Grid(最简单通用,适合数据量不大的场景)
你定义的列渲染逻辑本身已经是动态调用getTranslation()获取当前区域的翻译值,只需要触发Grid重新渲染所有已加载的行即可完成翻译刷新,直接调用Grid的refreshAll()方法:
@Override public void localeChange(LocaleChangeEvent localeChangeEvent) { // 原有其他组件刷新逻辑保持不变 myTextfield.setLabel(getTranslation(textfieldI18nKey)); myCombobox.setLabel(getTranslation(comboboxI18nKey)); myCombobox.setItemLabelGenerator(myCombobox.getItemLabelGenerator()); // 新增Grid刷新逻辑 grid.refreshAll(); }
该方法是Vaadin官方提供的标准Grid内容刷新方式,会触发所有可见行的单元格重新渲染,自动读取最新的翻译值。
方案二:单列单独刷新(适合数据量大、不想刷新整个Grid的场景)
你可以参考ComboBox的刷新逻辑,重新设置目标列的渲染器,只触发该列的重绘:
- 首先将列的标签生成逻辑抽为成员变量,避免重复写逻辑:
// 定义为视图类的成员变量 private final ItemLabelGenerator<MyDomainClass> myEnumColumnGenerator = gridItem -> { String i18nKey = gridItem.getMyEnumAttribute().name(); return getTranslation(i18nKey); };
- 初始化列时直接使用该生成器:
Column<MyDomainClass> myColumn = grid.addColumn(new TextRenderer<>(myEnumColumnGenerator));
- 在区域切换逻辑中重新给列设置渲染器:
@Override public void localeChange(LocaleChangeEvent localeChangeEvent) { // 原有其他组件刷新逻辑保持不变 myTextfield.setLabel(getTranslation(textfieldI18nKey)); myCombobox.setLabel(getTranslation(comboboxI18nKey)); myCombobox.setItemLabelGenerator(myCombobox.getItemLabelGenerator()); // 重新设置列渲染器触发单列刷新 myColumn.setRenderer(new TextRenderer<>(myEnumColumnGenerator)); }
这种方式只会刷新指定列的内容,不会触发其他列的重绘,性能开销更低。
内容的提问来源于stack exchange,提问作者sdo
相关产品推荐
相关产品推荐

