2016-10-26 10 views
0

行の条件に基づいて背景行の色を変更しようとしています。私は非常に近いですが、私はかなり私の指を置くことはできません。 (私はそれが基本的なリストからオブジェクトを引き出していると考えているので、データを動的に取得することにします)NatTableで動的に行の色を変更します

以下の例では、各行の色は、オブジェクト)を返します。 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

参考資料使用したのは です。MyObj myObj = getGlazedListsGridLayer()。getBodyDataProvider()。getRowObject(rowPosition); – ekjcfn3902039

関連する問題