如何根据行 object 条件 NatTable 为行 header 单元格设置标签

How to set a label to row header cell based on row object condition NatTable

如果用户对数据进行了更改,我希望能够在该行的 header 单元格中标记一个指示。

我尝试了一些但没有成功。

我知道我应该给单元格设置标签,然后用图标装饰单元格。

我只是不知道如何将基于第 object 行的标签设置到第 header 行单元格。请帮忙。

natTable.addConfiguration(new AbstractRegistryConfiguration() {
    @Override
    public void configureRegistry(IConfigRegistry configRegistry) {

        configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER,
                new CellPainterDecorator(new ImagePainter() {
                    @Override
                    protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) {
                        Person obj = bodyLayerStack.getFilterList().get(cell.getRowIndex());
                        if (obj.isDirty() {
                            return dirtyImage;
                        } else {
                            return null;
                        }
                    }

                }, CellEdgeEnum.LEFT, new TextPainter()), DisplayMode.NORMAL, DIRTY_CELL_LABEL);
    }
});

如何将此 "DIRTY_CELL_LABEL" 标签设置为特定行(不是所有行)的行 header 单元格。

我不知道如何在 CellOverrideLabelAccumulator 中满足我的条件。

您需要按照我们的文档 https://www.eclipse.org/nattable/documentation.php?page=styling or the Getting started tutorial https://www.vogella.com/tutorials/NatTable/article.html or even in some posts here on Whosebug if you search for it, e.g. Adding colors to row in nattable based on condition

中的说明实施自定义 IConfigLabelAccumulator

对于懒惰的人,这里有一些可以轻松添加到 NatTable 示例中的代码。它适用于 married 属性 而不是 NatTable 示例中不可用的脏 属性:

  1. 注册一个IColumnLabelAccumulator到行头层

    RowHeaderLayer rowHeaderLayer =
        new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer());
    
    rowHeaderLayer.setConfigLabelAccumulator(new IConfigLabelAccumulator() {
    
        @Override
        public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) {
            Person person = bodyLayer.getBodyDataProvider().getRowObject(rowPosition);
            if (person.isMarried()) {
                configLabels.addLabel("MARRIED");
            }
        }
    });
    
  2. 注册样式

    natTable.addConfiguration(new AbstractRegistryConfiguration() {
    
        @Override
        public void configureRegistry(IConfigRegistry configRegistry) {
            configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER,
                    new CellPainterDecorator(
                            new TextPainter(),
                            CellEdgeEnum.LEFT,
                            new ImagePainter() {
                                @Override
                                protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) {
                                    return image;
                                }
    
                            }),
                    DisplayMode.NORMAL,
                    "MARRIED");
        }
    });
    

请注意,不需要在 ImagePainter 中进行额外检查,因为标签仅应用于具有该状态的单元格。