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
相关产品推荐
相关产品推荐

