11

SWT テーブルに大量の行を表示するにはどうすればよいでしょうか? 巨大とは、20K 行、20 列を超えるものです。なぜそんなに多くのデータを表示する必要があるのか​​ と聞かないでください。それは重要ではありません。ポイントは、エンドユーザーが待って退屈しないように、できるだけ速く動作させる方法です。各行にはオブジェクトのインスタンスが表示され、列はそのプロパティ (一部) です。JFace コンテンツ/ラベル プロバイダー パターンを使用することを考えましたが、テーブルにデータを直接ヒットするよりもさらに遅くなるのではないかと心配しています。これはそれがどのようになるかです:

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

私のコンピューターで 20,000 レコードを描画するには、約 20 秒かかります。私が Windows で見た最大のパフォーマンスの問題は、新しいテーブル項目が作成され、テキストが取り込まれたときに、SWT によって送信される信じられないほどの量のネイティブ ウィンドウ メッセージによって引き起こされます。これに対する優れた回避策を見つけました-データを入力する前にテーブルを非表示にし、完了したら表示します。ループの前に table.setVisible(false) を呼び出し、ループの後に table.setVisible(true) を呼び出すだけで、速度が 6 ~ 7 倍になります。

もっとスピードアップしたい。あなたは何を提案しますか?また、ウィジェットを非表示にするこのトリックが、SWT (別名 Linux) の Windows 以外の実装でどのように機能するのだろうか?

4

3 に答える 3

19

SWT はそれを行うことができます。SWT.VIRTUAL スタイル フラグを使用すると、アイテムはスクロールして表示されたときにのみ作成されます。方法は次のとおりです。

  1. スタイル SWT.VIRTUAL でテーブルを作成します
  2. Table#setItemCount() を使用して行数を設定します
  3. オンデマンドで TableItems を満たす SWT.SetData リスナーを追加します。

コード スニペットを次に示します。

public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    final Table table = new Table( shell, SWT.VIRTUAL );
    table.setItemCount( 10000 );
    table.addListener( SWT.SetData, new Listener() {
        public void handleEvent( Event event ) {
            TableItem item = (TableItem)event.item;
            item.setText( "Item " + table.indexOf( item ) );
        }
    } );
    shell.setSize( 300, 500 );
    shell.open();
    while( !shell.isDisposed() ) {
        if( !display.readAndDispatch() ) {
            display.sleep();
        }
    }
    display.dispose();
}
于 2010-05-05T13:41:44.823 に答える
2

テーブル表示で遅延読み込みを行いたい。基本的に、これらすべてのオブジェクトをメモリ内のオフスクリーンに保持し、少数の実際の G​​UI テーブル行のみを作成します。ユーザーがスクロールすると、そのスクロール位置にあるオブジェクトでこれらの行を再レンダリングします。

JFace の例については、この記事を参照してください(編集: おっと、この記事のことを意味していました)。

于 2009-11-13T00:44:26.300 に答える
2

1 - setText(int, String) の代わりに setText(String[]) を使用します。

2 - プロセスの前に myTable.setRedraw(false) を使用し、プロセスの後に myTable.setRedraw(true) を使用して、データのロード中にすべての再描画操作を停止します。

それはより簡単で、パフォーマンスを向上させることができます!!

幸運を。

私の側では、これを使用して、20 列の 2500 行を 300 ミリ秒未満でロードします.....今日の標準的な PC で。

于 2009-11-23T17:04:43.520 に答える