2016-10-26 102 views
0

我試圖根據行標準更改背景行顏色。我非常接近,但有些東西我不能完全放在手指上。 (我相信這是因爲我從一個底層列表中抽取一個對象與動態獲取數據,我在下面標記了這部分代碼)動態更改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(); 
} 

回答

2

,可能導致的重要組成部分問題缺失。哪個列表是由getEventList()返回的?如果它是基本的EventList,則始終以原始索引獲取對象。在排序時,通過SortedList應用轉換。因此,如果getEventList()返回最頂端的GlazedLists集合(SortedListFilterList,取決於您正在使用哪些功能),則應解決問題。

+0

是的我正在使用一個EventList。我必須做你說的。謝謝! – ekjcfn3902039

+0

僅供參考使用: MyObj myObj = getGlazedListsGridLayer()。getBodyDataProvider()。getRowObject(rowPosition); – ekjcfn3902039