动态更改 NatTable 中的行颜色

Posted

技术标签:

【中文标题】动态更改 NatTable 中的行颜色【英文标题】:Dynamically change row color in NatTable 【发布时间】:2017-03-09 05:25:49 【问题描述】:

我正在尝试根据行条件更改背景行颜色。我非常接近,但有些事情我无法完全理解。 (我相信这是因为我从底层列表中提取对象而不是动态获取数据。我在下面标记了这部分代码)

在下面的示例中,每行颜色都基于具有成功或失败值的对象 (MyObj)。如果 myObj 具有成功值,则该行应为绿色。如果 myObj 具有失败值,则该行应为红色。如果 myObj 没有值,则应使用默认行颜色。

当我运行代码时,行颜色按预期显示。但是,如果我对列进行排序,则原始行索引会在数据移动到新行索引时保持该颜色。我希望行颜色会随对象移动,而不是始终固定在该行索引处。

Example:
 Row 1 - "SUCCESS" - Shows Green
 Row 2 - "FAIL" - Shows Red

如果我按字母顺序对该列进行排序,我会得到:

 Row 1 - "FAIL - Shows Green
 Row 2 - "SUCCESS" - Shows Red

下面是我用来生成示例的代码sn-p:

void example() 
    getNatTable().addConfiguration(new AbstractRegistryConfiguration() 
        @Override
        public void configureRegistry(IConfigRegistry configRegistry) 
            Style cellStyleSuccess = new Style();
            cellStyleSuccess.setAttributeValue(
                                CellStyleAttributes.BACKGROUND_COLOR,
                                COLOR_SUCCESS);
            configRegistry.registerConfigAttribute(
                                CellConfigAttributes.CELL_STYLE, 
                                cellStyleSuccess,
                                DisplayMode.NORMAL, "SUCCESS");

            Style cellStyleFail = new Style();
            cellStyleFail.setAttributeValue(
                                CellStyleAttributes.BACKGROUND_COLOR, 
                                COLOR_FAILURE);
            configRegistry.registerConfigAttribute(
                                CellConfigAttributes.CELL_STYLE, 
                                cellStyleFail,
                                DisplayMode.NORMAL, "FAIL");
        
    );
    DataLayer dl = getGlazedListsGridLayer().getBodyDataLayer();
    IConfigLabelAccumulator cellLabelAccumulator = 
      new IConfigLabelAccumulator() 
        @Override
        public void accumulateConfigLabels(LabelStack configLabels, 
                        int columnPosition, int rowPosition) 
            configLabels.getLabels().clear();
            // TODO Is this the issue? Is there a better way to 
            // pull MyObj here?
            MyObj myObj = getEventList().get(rowPosition);
            if (myObj.getFoo().equals("SUCCESS")) 
                configLabels.addLabel("SUCCESS");
             else if (myObj.getFoo().equals("FAIL"))) 
                configLabels.addLabel("FAIL");
             else 
                // default color
            

        
    ;

    dl.setConfigLabelAccumulator(cellLabelAccumulator);
    getNatTable().configure();

【问题讨论】:

【参考方案1】:

缺少可能导致问题的重要部分。 getEventList() 返回哪个列表?如果它是基本的EventList,您总是会在原始索引处获得对象。当您排序时,通过SortedList 应用转换。因此,如果 getEventList() 返回最顶部的 GlazedLists 集合(SortedListFilterList 取决于您使用的功能),您的问题应该得到解决。

【讨论】:

是的,我正在使用 EventList。我必须照你说的做。谢谢! 仅供参考我使用:MyObj myObj = getGlazedListsGridLayer().getBodyDataProvider().getRowObject(rowPosition);

以上是关于动态更改 NatTable 中的行颜色的主要内容,如果未能解决你的问题,请参考以下文章

当多种背景颜色组合在 nattable 中时,如何在顶部显示特定颜色?

如何根据严重性更改数据网格中的行颜色?

如何根据条件更改 DataGridView 的行颜色以检查日期是不是过期

选中复选框后如何更改datagridview中的行颜色

如何根据值更改jquery dataTable中的行颜色

如何在 Sqlite 数据库中的特定数据上更改 Listview 中的行颜色