Динамическое изменение цвета строки в 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();
}

person ekjcfn3902039    schedule 26.10.2016    source источник


Ответы (1)


Важная часть, которая, вероятно, вызывает проблему, отсутствует. Какой список возвращает getEventList()? Если это базовый EventList, вы всегда получаете объект по исходному индексу. При сортировке применяется преобразование через SortedList. Таким образом, ваша проблема должна быть решена, если getEventList() возвращает самую верхнюю коллекцию GlazedLists (SortedList или FilterList в зависимости от того, какие функции вы используете).

person Dirk Fauth    schedule 26.10.2016
comment
да, я использую EventList. Я должен буду сделать то, что ты сказал. Спасибо! - person ekjcfn3902039; 26.10.2016
comment
К вашему сведению, я использовал: MyObj myObj = getGlazedListsGridLayer().getBodyDataProvider().getRowObject(rowPosition); - person ekjcfn3902039; 26.10.2016