2011-06-27 3 views
0

以下は、私が何を話しているかをEclipseサイトから修正したスニペットです。 2つのパフォーマンス上の問題があります。スクロール・コンポジット内の多数のコンポジットのSWTパフォーマンス

1)最初は表示に数秒かかります。ループを10000に増やすと、長い時間がかかります(おそらくリニア)。

2)ボタンをクリックすると、パネルにウィジェットが追加され、スクロールバーのすべてのウィジェットが再びレイアウトされます。これには数秒かかる(長すぎます)。

もっと速くしようとしているこれらのことを達成する方法はありますか?

私は、「リスト」タイプのビューに任意のアイテムを表示する方法を考えようとしています。私の理解では、標準リストウィジェットは文字列のみを表示するので、私はこのように自分自身を設定しなければならないと思います。別の方法がありますか?

import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.ScrolledComposite; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.layout.RowLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Shell; 

public class Snippet188 { 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new FillLayout()); 
     final ScrolledComposite sc = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); 
     sc.setLayout(new FillLayout()); 
     final Composite c = new Composite(sc, SWT.NONE); 
     RowLayout rl = new RowLayout(SWT.VERTICAL); 
     rl.wrap = false; 
     c.setLayout(rl); 
     System.out.println(System.currentTimeMillis()); 
     for (int i = 0; i < 1000; i++) { 
      final Composite item = new Composite(c, SWT.NONE); 
      item.setLayout(new RowLayout(SWT.VERTICAL)); 
      Label l = new Label(item, SWT.NONE); 
      l.setText("Label " + i); 
      Button b = new Button(item, SWT.PUSH); 
      b.setText("Button " + i); 
      final int value = i; 
      b.addSelectionListener(new SelectionAdapter() { 
       public void widgetSelected(SelectionEvent e) { 
        System.out.println("clicked: " + value); 
        Label newL = new Label(item, SWT.NONE); 
        newL.setText("new Label " + value); 
        item.pack(); 
        c.pack(); 
       } 
      }); 
     } 
     System.out.println(System.currentTimeMillis()); 
     sc.setContent(c); 
     sc.setExpandHorizontal(true); 
     sc.setExpandVertical(true); 
     sc.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     sc.setShowFocusedControl(true); 

     shell.setSize(300, 500); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 
    } 
} 

答えて

2

あなたは同じことを達成するためにTableEditorと一緒に単一の列Tableを使用して同じことを達成しようとすることができます。このsnippetを見て、別のウィジェットを表のセルに追加する方法を示してください。

このようにして、作成するコンポジットとレイアウトのオーバーヘッドを避けることができます。また、必要に応じて仮想表を使用してリソースを作成することもできます。

+0

ありがとうございましたが、私はそのスニペットをとり、行数を40から1000に増やしました。それは表示されません。そう...その方法がうまくいくようには見えません。 – mentics

+0

要素/行の数が4-500を超える場合、仮想テーブルを使用します。これは通常のテーブルよりも速いです。テーブルの遅い対話は、表示されるすべてのテキストと画像を事前に見つけなければならない大部分のプラットフォームの制限に起因します。 –

関連する問題