2016-05-03 12 views
0

Ich bin dabei, JFace TableViewer durch NatTable zu ersetzen. In meiner Implementierung mit TableViewer habe ich Bilder in Zellen, und ich habe die Implementierung von ILabelProvider, die sich bewusst ist, wie man Bild für konkreten Zustand des Objekts zur Laufzeit erhält. Also rufe ich ILabelProvider.getImage(element) von ColumnLabelProvider.Icons in NatTable-Zellen

In NatTable ich kenne die Möglichkeit, ein Bild über die Registrierung configAttribute gegen ConfigLabel hinzuzufügen. Und für configAttribute sollte ich explizit sagen, welches Bild verwendet werden soll. Sicherlich kann ich Label für jeden Zustand erstellen, Bild für jedes Etikett registrieren und ConfigLabelAccumulator verwenden, um alles zusammen zu binden. Aber die Menge an Bildern ist ziemlich groß, und außerdem möchte ich diese Logik nicht kopieren. Gibt es einen geeigneteren Weg für einen solchen Fall? Nur delegieren zu bestehenden ILabelProvider?

+0

Siehe https://www.eclipse.org/forums/index.php/t/491100/ –

Antwort

2

In Fällen, in denen Sie eine gewisse Dynamik zum Abrufen der Image haben, reicht die Etikettenlösung nicht aus (z. B. wenn Sie über ein Ladensystem mit verschiedenen Bildern pro Zeilenobjekt nachdenken). In solchen Fällen implementieren Sie in der Regel eine benutzerdefinierte ImagePainter und implementieren den Code der Image zur Verwendung in der getImage() Methode zu bestimmen.

Das folgende Snippet kann als Ausgangspunkt verwendet werden, wo Sie nur Ihre benutzerdefinierte Logik implementieren müssen, um den Image zu bestimmen, den Sie verwenden können. Auf diese Weise müssen Sie nur eine ImagePainter registrieren. In NatTable wird dies auch für einige statische Bilder wie zum Beispiel die TreeImagePainter getan.

public class ContentDependentImagePainter<T> extends ImagePainter { 

    IRowDataProvider<T> dataProvider; 

    public ContentDependentImagePainter(IRowDataProvider<T> dataProvider) { 
     this.dataProvider = dataProvider; 
    } 

    @Override 
    protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) { 
     // get the row object 
     T rowObject = dataProvider.getRowObject(cell.getRowIndex()); 
     Image result = null; 

     // perform your custom logic to determine the Image 

     return result; 
    } 
}