动态更改 NatTable 中的行颜色
Dynamically change row color in NatTable
我正在尝试根据行标准更改背景行颜色。我非常接近,但有些事情我不能完全确定。 (我相信这是因为我是从底层列表中提取对象而不是动态获取数据。我在下面标记了这部分代码)
在下面的示例中,每一行颜色都基于具有成功或失败值的对象 (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();
}
缺少可能导致问题的重要部分。 getEventList()
返回哪个列表?如果它是基本的 EventList
你总是在原始索引处获得对象。当您排序时,将通过 SortedList
应用转换。因此,如果 getEventList()
returns 最顶部的 GlazedLists 集合(SortedList
或 FilterList
取决于您使用的功能),您的问题应该得到解决。
我正在尝试根据行标准更改背景行颜色。我非常接近,但有些事情我不能完全确定。 (我相信这是因为我是从底层列表中提取对象而不是动态获取数据。我在下面标记了这部分代码)
在下面的示例中,每一行颜色都基于具有成功或失败值的对象 (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();
}
缺少可能导致问题的重要部分。 getEventList()
返回哪个列表?如果它是基本的 EventList
你总是在原始索引处获得对象。当您排序时,将通过 SortedList
应用转换。因此,如果 getEventList()
returns 最顶部的 GlazedLists 集合(SortedList
或 FilterList
取决于您使用的功能),您的问题应该得到解决。