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

Vaadin 7 Grid使用ComponentRenderer时冻结列失效问题求助

Vaadin Grid组件冻结列在ComponentRenderer场景下失效问题求助

正在开发一款支持排序、筛选、列冻结功能的Grid配置组件。普通列的冻结在任何场景下均正常,但使用ComponentRenderer的列,在数据集发生变更(如排序、筛选操作)时,冻结状态会被重置。值得注意的是,若同时冻结普通列和带组件的列,则不会出现此问题。

目前未在代码中定位到该行为的触发原因,但观察到:当Grid数据变更(例如设置排序)时,带组件列的元素样式中的transform: translate3d(...)属性会被直接重置。

恳请提供排查方向或解决思路。

环境版本

  • Vaadin 7.7.15
  • ComponentRenderer 1.0.3

相关代码逻辑

列更新逻辑(ItemSetChangeListener触发)

updateVisibleColumns方法负责更新列配置,其中包含ComponentRenderer的设置:

protected void updateVisibleColumns() {
    if (dataSource == null) {
        return;
    }
    final Collection<DataSourceColumn> visibleColumns = dataSource.getVisibleColumns();
    setColumns(visibleColumns.toArray());

    Map<String, ArrayList<Object>> groupMap = new HashMap<>();

    for (final DataSourceColumn column : visibleColumns) {
        if (column.getGroup() != null) {
            if (!groupMap.containsKey(column.getGroup())) {
                groupMap.put(column.getGroup(), new ArrayList<>());
            }
            groupMap.get(column.getGroup()).add(column);
        }

        final Column gridColumn = getColumn(column);
        gridColumn.setHeaderCaption(column.getCaption());
        if (column.getFormat() != null && !Component.class.isAssignableFrom(column.getType())) {
            gridColumn.setConverter(new DataSourceColumnConverter(column));
        }
        if (Resource.class.isAssignableFrom(column.getType())) {
            gridColumn.setRenderer(new ImageRenderer());
        } else if (Component.class.isAssignableFrom(column.getType())) {
            gridColumn.setRenderer(new ComponentRenderer());
        }
    }
    recalculateColumnWidths();
}

示例自定义组件

用于列渲染的可点击组件实现:

public class ClickableLabelField extends VerticalLayout implements Field<String>

列冻结配置逻辑

独立类中实现的冻结列设置方法:

private final CheckBoxWithCaption fixFirstColumn
        = new CheckBoxWithCaption("Закрепить первую колонку");
private final CheckBoxWithCaption severalFixColumn
        = new CheckBoxWithCaption("Закрепить несколько колонок");
private final CheckBoxWithCaption showStripeRow
        = new CheckBoxWithCaption("Отображать \"зебру\"");

public void setSettings() {
    if (grid == null || grid.getColumns().isEmpty()) {
        return;
    }
    if (Boolean.TRUE.equals(fixFirstColumn.getValue())) {
        grid.setFrozenColumnCount(1);
    } else if (Boolean.TRUE.equals(severalFixColumn.getValue())) {
        Long fixColumn = getNumberColumnValue(columnNumberField.getValue());
        if (fixColumn != null) {
            grid.setFrozenColumnCount(fixColumn.intValue());
        }
    }

    if (Boolean.TRUE.equals(showStripeRow.getValue())) {
        grid.removeStyleName(EKPTheme.GRID_NO_STRIPE);
    } else {
        grid.addStyleName(EKPTheme.GRID_NO_STRIPE);
    }
}

内容的提问来源于stack exchange,提问作者Egor Vasilyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:15:42