SWTテーブルに大量の行を表示するにはどうしますか? 20K行、20列を超えるものは巨大です。なぜ私は多くのデータを表示する必要があるのか聞かないでください、それはポイントではありません。要点は、エンドユーザーが飽きることがないようにできるだけ速く動作させる方法です。各行はあるオブジェクトのインスタンスを表示し、列はそのプロパティ(あるもの)です。私はJFaceのコンテンツ/ラベルプロバイダのパターンを使用すると思っていましたが、データを直接テーブルに当てるよりもさらに遅くなる恐れがあります。これは次のようになります。SWT/JFace RCPアプリケーションに大きなテーブルを挿入する
Display.getDefault().asyncExec(new Runnable() {
public void run() {
List<MyObject> objects = model.getViewData();
for(MyObject object: objects){
TableItem item = new TableItem(table, SWT.NULL);
item.setImage(0, img1);
item.setBackground(color1);
item.setText(0, object.getProperty0());
item.setText(1, object.getProperty1());
item.setText(2, object.getProperty2());
.....
}
});
自分のコンピュータに20kレコードを描画するのに約20秒かかります。 Windowsで見たパフォーマンスの最大の問題は、新しいテーブル項目が作成され、テキストが入力されたときにSWTによって送信される膨大な量のネイティブウィンドウメッセージによるものです。私はこのための大きな回避策を見つけました - 移入する前に表を非表示にして、それが完了したら表示してください。ループの前にtable.setVisible(false)を呼び出し、ループの後にtable.setVisible(true)を呼び出すだけで、速度は6〜7倍になります!
私はさらにスピードアップしたいと思います。 あなたは何をお勧めしますか?また、ウィジェットを隠しているこのトリックがSWT(別名Linux)の非ウィンドウ実装でどのように動作するのだろうか?
これはまさに解決策ですが、100k行を埋めるのはほぼゼロ時間です。非常に驚くべき機能です。ありがとうございました! – Dima
@ralfstxどうすればこのようなテーブルをフィルタリングできますか? –
@AdamAroldこれについては、「DeferredContentProvider」を参照してください(例:this [tutorial](http://waynebeaton.wordpress.com/2008/01/16/deferredcontentprovider-my-new-favourite-thing/)を参照してください) 。しかし、スクロール時にリフレッシュに関するいくつかの問題があるかもしれないことに注意する必要があります:https://bugs.eclipse.org/bugs/show_bug.cgi?id=146799 – hnn