Я пытаюсь изменить цвет строки фона на основе критериев строк. Я очень близок, но есть что-то, чего я не могу точно указать. (Я полагаю, это потому, что я извлекаю объект из базового списка, а не получаю данные динамически. Я отметил этот раздел кода ниже)
В приведенном ниже примере каждый цвет строки основан на объекте (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();
}