2016-10-26 3 views
0

Ich versuche, die Hintergrundzeilenfarbe basierend auf den Zeilenkriterien zu ändern. Ich bin sehr nah dran, aber da ist etwas, an das ich nicht wirklich denken kann. (Ich glaube, das liegt daran, dass ich ein Objekt aus einer zugrunde liegenden Liste ziehe, anstatt die Daten dynamisch zu erhalten. Ich habe diesen Abschnitt des Codes unten markiert)Dynamische Änderung der Zeilenfarbe in NatTable

Im folgenden Beispiel basiert jede Zeilenfarbe auf einem Objekt (MyObj) die einen Erfolgs- oder Fehlerwert hat. Wenn myObj einen Erfolgswert hat, sollte die Zeile grün sein. Wenn myObj einen Fehlerwert hat, sollte die Zeile rot sein. Wenn myObj keinen Wert hat, sollte die Standardzeilenfarbe verwendet werden.

Wenn ich den Code ausführen, werden die Zeilenfarben wie erwartet angezeigt. Wenn ich jedoch die Spalten sortiere, behält der Index der ursprünglichen Zeilen diese Farbe bei, während die Daten in einen neuen Zeilenindex verschoben werden. Ich würde erwarten, dass sich die Zeilenfarbe mit dem Objekt bewegt, anstatt immer in diesem Zeilenindex fixiert zu sein.

Example: 
Row 1 - "SUCCESS" - Shows Green 
Row 2 - "FAIL" - Shows Red 

Wenn ich irgendwie auf dieser Spalte alphabetisch ich:

Row 1 - "FAIL - Shows Green 
Row 2 - "SUCCESS" - Shows Red 

Unten ist der Code-Schnipsel ich das Beispiel zu erzeugen, verwenden:

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(); 
} 

Antwort

2

Der wichtige Teil, der wahrscheinlich die Ursachen Problem fehlt. Welche Liste wird von getEventList() zurückgegeben? Wenn es das grundlegende EventList ist, erhalten Sie immer das Objekt am ursprünglichen Index. Beim Sortieren wird eine Transformation über SortedList angewendet. Ihr Problem sollte also gelöst werden, wenn getEventList() die oberste GlazedLists-Sammlung zurückgibt (SortedList oder FilterList abhängig davon, welche Funktionen Sie verwenden).

+0

Ja ich verwende eine EventList. Ich werde tun müssen, was du gesagt hast. Vielen Dank! – ekjcfn3902039

+0

FYI Ich benutzte: MyObj myObj = getGlazedListsGridLayer(). GetBodyDataProvider(). GetRowObject (rowPosition); – ekjcfn3902039

Verwandte Themen