繁体   English   中英

Java SWT ScrolledComposite Performance with many Composites inside

[英]Java SWT ScrolledComposite Performance with many Composites inside

我的 Java SWT ScrolledComposite 有问题:

在(居中的)ScrolledComposite 中显示了许多图片预览(参见图片图像)。 如果加载了 ScrolledComposite 中的图像,则需要很长时间。 在那之后,预览滞后于scolling。

快速:它的性能非常差。 所以我的想法是:我计算 scoll 条并仅加载显示的图片。 如果用户向下滑动,它将加载其他图片。

我的(测试)代码:

    Composite center = new Composite(form, SWT.NONE);
    center.setLayout(new FillLayout());

    ScrolledComposite centerScrolledComposite = new ScrolledComposite(center, SWT.V_SCROLL | SWT.BORDER);

    Display display = getDisplay();
    Image image1 = display.getSystemImage(SWT.ICON_WORKING);
    Image image2 = display.getSystemImage(SWT.ICON_QUESTION);
    Image image3 = display.getSystemImage(SWT.ICON_ERROR);


    Composite wrappedScrolledComposite = new Composite(centerScrolledComposite, SWT.NONE);
    for (int i = 0; i <= 5000; i++)
    {
        Label label = new Label(wrappedScrolledComposite, SWT.NONE);
        if (i % 3 == 0)
            label.setImage(image1);
        if (i % 3 == 1)
            label.setImage(image2);
        if (i % 3 == 2)
            label.setImage(image3);
    }
    
    RowLayout layout = new RowLayout(SWT.HORIZONTAL);
    layout.wrap = true;
    wrappedScrolledComposite.setLayout(layout);

    centerScrolledComposite.setContent(wrappedScrolledComposite);
    centerScrolledComposite.setExpandHorizontal(true);
    centerScrolledComposite.setExpandVertical(true);
    centerScrolledComposite.addControlListener(new ControlAdapter() {
        public void controlResized(ControlEvent e) {
          Rectangle r = centerScrolledComposite.getClientArea();
          centerScrolledComposite.setMinSize(wrappedScrolledComposite.computeSize(r.width, SWT.DEFAULT));
        }
      });

但是..我不知道这是否可能。 有没有人有类似的问题? 谢谢

PS:我需要一个与 Windows 10 文件浏览器非常相似的视图,其中“Big Icos”作为预览......并且性能相同:)

TableTableViewer替换所有这些标签 - 只需一个控件。

由于表格可以自行滚动,因此您也不需要 ScrolledComposite。

Table table = new Table(form, SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE);

for (int i = 0; i <= 5000; i++)
 {
   TableItem label = new TableItem(table, SWT.NONE);
   if (i % 3 == 0)
     label.setImage(image1);
   if (i % 3 == 1)
     label.setImage(image2);
   if (i % 3 == 2)
     label.setImage(image3);
 }

为了获得更好的性能,您可以将表格设置为“虚拟”并根据需要填充内容:

Table table = new Table(composite, SWT.VIRTUAL | SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE);

table.setItemCount(5000);

table.addListener(SWT.SetData, event -> {
      TableItem label = (TableItem)event.item;
      int i = table.indexOf(label);
      if (i % 3 == 0)
        label.setImage(image1);
      if (i % 3 == 1)
        label.setImage(image2);
      if (i % 3 == 2)
        label.setImage(image3);
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM