2016-10-26 2 views
0

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

ответ

2

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

+0

Да, я использую EventList. Я должен буду делать то, что ты сказал. Благодаря! – ekjcfn3902039

+0

FYI Я использовал: MyObj myObj = getGlazedListsGridLayer(). GetBodyDataProvider(). GetRowObject (rowPosition); – ekjcfn3902039

 Смежные вопросы

  • Нет связанных вопросов^_^