2017-11-21 2 views
0

ScrolledCompositeに含まれるCompositeに多くのラベルを追加しようとすると、特定の数(1638)が表示された後、後のコンポーネント。これは、表示することができるか、私が間違っていることのいくつかに厳しい制限ですか?私はちょうどのテキストの2000行とつのラベルを追加した場合大量のコンテンツを追加するときにScrolledCompositeレンダリングが正しく行われない

これがまた起こる。

public class LoadsOfLabelsTestDialog extends Dialog 
{ 
    List<Label> displaylabels = new ArrayList<>(); 
    Composite content, list; 
    ScrolledComposite scroll; 

    public LoadsOfLabelsTestDialog(Shell parentShell) 
    { 
     super(parentShell); 
    } 

    @Override 
    protected void configureShell(Shell shell) 
    { 
     super.configureShell(shell); 
     shell.setSize(new Point(700, 500)); 
     shell.setText("FML"); //$NON-NLS-1$ 
    } 

    @Override 
    public Control createDialogArea(final Composite comp) 
    { 
     content = (Composite) super.createDialogArea(comp); 
     content.setLayout(new GridLayout(1, false)); 
     content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

     Button set1 = new Button(content, SWT.PUSH); 
     set1.setText("Display List 1"); 
     set1.addSelectionListener(new SelectionAdapter() { 

      @Override 
      public void widgetSelected(SelectionEvent e) { 
       List<String> rows = new ArrayList<>(); 
       for (int i = 0; i < 2000; i++) { 
        rows.add(i +" row"); 
       } 
       updateList(rows); 
      } 
     }); 




     scroll = new ScrolledComposite(content, SWT.V_SCROLL); 
     list = new Composite(scroll, SWT.NONE); 
     list.setLayout(new GridLayout(1, true)); 

     scroll.setContent(list); 
     scroll.setExpandHorizontal(true); 
     scroll.setExpandVertical(true); 

     scroll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); 
     new Label(content, SWT.HORIZONTAL | SWT.SEPARATOR); 
     setScrollSize(); 
     return content; 
    } 

    private void setScrollSize() { 
     scroll.setMinSize(list.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    } 

    private void updateList(List<String> rows) { 
     if (this.displaylabels == null) { 
      this.displaylabels = new ArrayList<>(); 
     } 
     for (Label l : displaylabels) { 
      l.dispose(); 
     } 
     this.displaylabels.clear(); 


     for (String item : rows) { 
      addListLabel(item); 
     } 
     content.layout(true, true); 
     setScrollSize(); 
    } 

    private void addListLabel(String whoText) { 
     Label a = new Label(list, SWT.NONE); 
     a.setText(whoText); 
     this.displaylabels.add(a); 
    } 

    public static void main(String[] args) 
    { 
     Display d = new Display(); 
     Shell s = new Shell(); 

     LoadsOfLabelsTestDialog fml = new LoadsOfLabelsTestDialog(s); 
     fml.open(); 
    } 

} 
+0

テーブルやTableViewerは膨大な数のラベルより良いアイデアかもしれません –

答えて

1

あなたはハードリミット、コントロールのおそらく最大サイズをヒット。この制限は他のプラットフォームでは若干異なる場合がありますが、任意にコントロールのサイズを変更することはできません。

@greg-449として、Tableを使用することをお勧めします。表の行ごとの内容が単なるイメージとテキスト以上の場合は、ペイントリスナーを追加して行の内容を自分で描画することができます。

+0

私はorg.eclipse.swt.widgets.Listを使用しました。これはそれを扱うようです。それはむしろ迷惑なものですが、リストと呼ばれています。 – Link19

関連する問題