2016-11-10 4 views
0

私は次のコードスニペットを持っています。NatTableはrepaintCellの後で手動リフレッシュが必要ですか?

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

私は上記のコードを実行すると、私はGUIに表示されたテーブルをクリックした後、影響を受けた細胞のみを塗り替えます。そのコードをコメントアウトしてgetNatTable().refresh();を使用すると、最初にテーブルをクリックしなくても再描画できます。

GUIに表示されたテーブルをクリックせずにセルを再描画する方法はありますか?このコードが何度も実行される大きなテーブルに対して、refresh()を呼び出さなければならないのは嫌です。

+0

なぜ手動でrepaintCell()を手動で呼び出すのですか? –

+0

私は、その外見上何らかの外部要因のために変化する可能性があるその画像を持っています。 – ekjcfn3902039

+0

具体的には、私は外部コードでコールバックを登録します。コールバックを介して私はオブジェクト(myObjと呼ばれる)を取得し、myObjを使って変更する必要があるセルを決定します。 repaintCell()を呼び出すと、必要なIConfigLabelAccumulatorコードが再実行され、表示する正しいイメージを決定します。 IConfigLabelAccumulatorコードは、myObjを使用して外部サービスを呼び出し、描画するイメージを決定します。イメージはmyObjの外側のものから決定されるため、テーブルに保持されているデータは変更されません。つまり、myObjには内部的な値がありません。 – ekjcfn3902039

答えて

1

いいえいいえ、再描画をトリガーするために追加の手順を実行する必要はありません。あなたのコードの問題は間違ったインデックス値の使用です。グリッドがあるので、列0はNatTableパースペクティブの行ヘッダーです。私は、NatTableの観点からインデックス1である本文の最初の列を再描画したいとします。また、SelectionLayerでインデックスを計算するときに、行インデックスは正しくありませんが、実際にはテーブルのインデックスが必要です。カラムヘッダー行のみを持つ場合は、少なくとも+1になります。

実際には、グリッドに1つの行ヘッダー列と1つの列ヘッダー行がある場合は、インデックスに1を追加することでコードが機能します。

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

私は列をソートすると、再ペイントが期待どおりに起きるかどうかわかりません。韻や理由はなく、適切なアイコンを表示するには行をクリックする必要があります。特定のセルをリフレッシュするために別の呼び出しを行うことはできますか? – ekjcfn3902039

+0

インデックス位置の変換についてお読みください。 NatTableでは、実際に現在表示されているポジションを操作します。インデックスに変換する場合、再描画したいセルはおそらく表示されません。これは、インデックスが基になるリストの実際のデータ位置を表すためです。このチュートリアルのチュートリアルの章はhttp://www.vogella.com/tutorials/NatTable/article.html –

+0

ですので、DataLayerに基づいてセルを再ペイントすることになっていますか?私は記事を読んでいますが、与えられたコードサンプルで問題を解決する方法について私には意味がありません – ekjcfn3902039

関連する問題