2011-06-27 27 views
0

下面是一个来自eclipse站点的修改片段,用于展示我正在谈论的内容。有2个性能问题。在ScrolledComposite中有很多复合材料的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

您可以尝试使用单个列Table连同TableEditor来达到同样达到相同的。看看这个snippet,它显示了如何添加另一个小部件到表单元格。

这样你就可以避免创建尽可能多的复合材料和布局开销。您也可以使用虚拟表来根据需要创建资源。

+0

谢谢,但我拿了那个片段,并增加了从40到1000的行数,它甚至不会显示。所以......似乎这种方法不会奏效。 – mentics

+0

如果元素/行的数量超过4-500,则使用虚拟表格......这比常规表格快得多。表格的缓慢互动是由于大多数平台的限制,所有要显示的文本和图像必须事先找到。 –