You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 8 Grid Object类型列设置Renderer时getColumn返回null求助

Vaadin 8 Grid Object类型列格式化问题解决方法

问题根源

你调用grid.getColumn(entry.getKey())返回null的核心原因是:getColumn()方法的入参是列的唯一ID,你在调用addColumn()添加列的时候没有给列绑定对应的ID,所以无法通过key查询到对应列。

快速修复方案

只需要在添加列时补充setId(entry.getKey())绑定列ID即可:

grid.addColumn(h -> h.get(entry.getKey()))
    .setId(entry.getKey()) // 新增此行,将列ID和你的map key绑定
    .setCaption(captn)
    .setStyleGenerator(item -> "v-align-right");

修复后你后续的getColumn()调用就能正常获取到列对象了。

更稳妥的完整可运行示例

推荐直接在添加列阶段就判断值类型配置对应的Renderer,不需要后续再查询列调整配置,降低出错概率:

import com.vaadin.ui.Grid;
import com.vaadin.ui.renderers.NumberRenderer;
import org.apache.commons.lang3.math.NumberUtils;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class DynamicObjectGridDemo {
    public Grid<LinkedHashMap<String, Object>> createDynamicGrid(
            List<LinkedHashMap<String, Object>> dataSource,
            Map<String, String> columnKeyToCaption
    ) {
        Grid<LinkedHashMap<String, Object>> grid = new Grid<>();
        grid.setItems(dataSource);

        for (Map.Entry<String, String> columnConfig : columnKeyToCaption.entrySet()) {
            String columnKey = columnConfig.getKey();
            String columnCaption = columnConfig.getValue();

            // 样本值判断列类型,可根据业务需求调整空值、异常值处理逻辑
            Object sampleVal = dataSource.isEmpty() ? null : dataSource.get(0).get(columnKey);
            boolean isNumberColumn = sampleVal != null && NumberUtils.isCreatable(sampleVal.toString());

            if (isNumberColumn) {
                // 数字列配置右对齐+数字格式化渲染器
                grid.addColumn(item -> {
                            Object val = item.get(columnKey);
                            return val instanceof Number ? (Number) val : null;
                        })
                        .setId(columnKey)
                        .setCaption(columnCaption)
                        .setStyleGenerator(item -> "v-align-right")
                        // 可根据需要调整格式串和Locale,比如欧洲格式可传入Locale.GERMANY
                        .setRenderer(new NumberRenderer("###,###,###,##0.###"));
            } else {
                // 普通列默认文本渲染
                grid.addColumn(item -> item.get(columnKey))
                        .setId(columnKey)
                        .setCaption(columnCaption);
            }
        }
        return grid;
    }
}

注意事项

  • 数字格式串可按需调整:整数部分的逗号是千分位分隔符,小数部分的点是小数点,如果你需要反转分隔符可搭配Locale参数使用
  • 若同一列可能存在混合类型值,建议在值提供者中加类型兼容处理,避免渲染阶段抛出类型转换异常
  • 如果不需要后续通过ID操作列,可省略setId()调用,所有配置在添加列时一次性完成即可

内容的提问来源于stack exchange,提问作者Chris Suen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:06:11