如何用SWT.Virtual过滤Table中的输入?

How to filter the inputs in Table with SWT.Virtual?

在我的项目中,我有一个 TableViewer 需要显示大约 3000 个项目并过滤它们。如果没有 SWT.VIRTUAL,table 需要数秒才能显示。
所以,我实现了 ILazyContentProvider 而不是使用“ArrayContentProvider”,但现在我在过滤 TableViewer.

的元素时遇到了问题

我正在编写以下过滤代码,但 select 方法根本不是 运行。

   private static class DefaultFilterextends ViewerFilter {
    
            private String searchText;
    
            public void setSearchText(final String searchText) {
                this.searchText = searchText;
            }
    
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (this.searchText == null) {
                    return true;
                }
                return (element.toString().contains(searchText) || element.toString().equals(searchText));
            }
    }

下面的ContentProvider,我正在写

  private class LazyContentProvider implements ILazyContentProvider {

        private TableViewer viewer;
        private List<String> elements;

        public LazyContentProvider(TableViewer viewer) {
            this.viewer = viewer;
        }

        @Override
        public void dispose() {
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            this.elements = (List<String>) newInput;
        }

        @Override
        public void updateElement(int index) {
            viewer.replace(elements.get(index), index);
        }

    }

有人可以指导我如何使用 SWT.VIRTUAL 过滤 TableViewer 中的元素吗?

TableViewer 在使用 SWT.VIRTUAL 时不支持过滤。相反,您必须在内容提供程序中进行过滤。

内容提供者需要维护过滤后的元素列表。例如:

public class LazyContentProvider implements ILazyContentProvider
{
  private TableViewer viewer;
  private List<String> allElements;
  private List<String> filteredElements;


  public LazyContentProvider()
  {
    //
  }


  @Override
  public void dispose()
  {
    //
  }


  @SuppressWarnings("unchecked")
  @Override
  public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput)
  {
    this.viewer = (TableViewer)viewer;

    allElements = (List<String>)newInput;

    filteredElements = allElements;
  }


  @Override
  public void updateElement(final int index)
  {
    viewer.replace(filteredElements.get(index), index);
  }


  public void filter(final String searchText)
  {
    filteredElements = allElements.stream().filter(element -> element.contains(searchText)).toList();

    viewer.setItemCount(filteredElements.size());

    viewer.refresh();
  }
}

我在这里添加了一个 filteredElements 列表,它只包含当前过滤的元素,这在 updateElement.

中使用

我添加了一个 filter 方法来更新过滤后的元素列表。它还会告诉 table 查看器新项目计数并刷新 table.

过滤器流中的 .toList() 方法需要 Java 16,对于旧版本的 Java 使用 .collect(Collectors.toList()).