2016-11-10 3 views
0

Ich habe das folgende Code-Snippet.Braucht NatTable nach repaintCell eine manuelle Aktualisierung?

int index = getEventList().indexOf(myObj); 
    SelectionLayer selectionLayer = getGlazedListsGridLayer() 
     .getBodyLayerStack().getSelectionLayer();   
    getNatTable().repaintCell(0,selectionLayer.getRowIndexByPosition(index)); 

Wenn ich den Code ausführen oben gezeigt, nur die betroffenen Zellen, nachdem ich auf dem Tisch in der Benutzeroberfläche angezeigt klicken Sie neu gestrichen. Wenn ich diesen Code auskommentiere und getNatTable().refresh(); benutze, überstreiche ich es, ohne dass ich zuerst auf den Tisch klicken muss.

Gibt es eine Möglichkeit, eine Zelle neu zu zeichnen, ohne auf die in der GUI angezeigte Tabelle klicken zu müssen? Ich würde hassen, Refresh() für eine große Tabelle aufrufen zu müssen, wo dieser Code viele Male ausgeführt werden kann.

+0

Warum möchten Sie repaintCell() manuell aufrufen? –

+0

Ich habe ein Bild auf dieser Zelle, die sich aufgrund eines externen Faktors ändern kann – ekjcfn3902039

+0

Um genauer zu sein, registriere ich einen Rückruf mit externem Code. Durch den Callback bekomme ich das Objekt (myObj genannt) und benutze myObj, um die Zelle zu bestimmen, die geändert werden muss. Wenn ich RepaintCell() aufrufe, führt es den erforderlichen IConfigLabelAccumulator-Code erneut aus, um das richtige Bild zu bestimmen, das angezeigt werden soll. Der IConfigLabelAccumulator-Code ruft einen externen Dienst mit myObj auf, um zu bestimmen, welches Bild gezeichnet werden soll. Die in der Tabelle enthaltenen Daten ändern sich nicht, da das Bild von etwas außerhalb von myObj bestimmt wird. Mit anderen Worten, myObj hat keinen internen Wert, der sich ändert. – ekjcfn3902039

Antwort

1

Nein, Sie müssen keinen zusätzlichen Schritt ausführen, um die Neulackierung auszulösen. Das Problem in Ihrem Code ist die Verwendung falscher Indexwerte. Sie haben ein Gitter, also Spalte 0 ist die Zeilenüberschrift aus der NatTable-Perspektive. Ich nehme an, dass Sie die erste Spalte des Körpers neu zeichnen möchten, der Index 1 von der NatTable-Sicht ist. Auch der Zeilenindex ist falsch, da Sie den Index in der SelectionLayer berechnen, aber tatsächlich den Index in der Tabelle benötigen, der mindestens +1 ist, wenn Sie nur eine Spaltenüberschrift haben.

Eigentlich sollte Ihr Code funktionieren, indem Sie 1 für den Index hinzufügen, wenn Sie eine Zeilenkopfzeile und eine Spaltenkopfzeile im Raster haben.

getNatTable().repaintCell(1, selectionLayer.getRowIndexByPosition(index) + 1); 
+0

Ich merke, dass wenn ich Spalten sortiere, das Repaint möglicherweise nicht wie erwartet passieren kann. Es gibt keinen Reim oder Grund und ich muss auf eine Zeile klicken, um die richtigen Symbole anzuzeigen. Gibt es einen weiteren Anruf, den ich machen kann, um eine bestimmte Zelle zu aktualisieren? – ekjcfn3902039

+0

lesen Sie bitte über die Index-Position Transformation. Auf NatTable operierst du auf Positionen, die du gerade siehst. Wenn Sie zum Index umwandeln, ist die Zelle, die Sie neu zeichnen möchten, wahrscheinlich nicht sichtbar, da der Index die tatsächliche Datenposition in der zugrunde liegenden Liste darstellt. Es gibt ein Kapitel darüber in der Getting Started Tutorial http://www.vogella.com/tutorials/NatTable/article.html –

+0

Also soll ich die Zelle auf der Grundlage der DataLayer dann neu streichen? Ich habe den Artikel gelesen, aber es ergibt für mich keinen Sinn, das Problem mit dem gegebenen Codebeispiel zu lösen – ekjcfn3902039