动态更改NatTable

时间:2016-10-26 18:00:42

标签: java nattable

我正在尝试根据行条件更改背景行颜色。我非常接近,但是我可以完全放下手指。 (我相信它是因为我从基础列表中提取对象而不是动态获取数据。我在下面标记了代码的这一部分)

在下面的示例中,每个行颜色都基于具有成功或失败值的Object(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

以下是我用来生成示例的代码段:

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 个答案:

答案 0 :(得分:2)

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