如何使用swt.virtual过滤表中的输入?

发布于 2025-01-25 10:02:03 字数 1596 浏览 3 评论 0原文

在我的项目中,我有一个tableViewer,它需要显示大约3000个项目并进行过滤。没有swt.virtual表需要多秒钟才能显示。
因此,我实现了iLazyContentProvider,而不是使用“ ArrayContentProvider”,但是现在我在过滤TableViewer的元素时面临问题。

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

   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));
            }
    }

下面的内容提供者,我写的

  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中进行元素的过滤?

In my project, I have a TableViewer which needs to show around 3000 items and also filter them. Without SWT.VIRTUAL the table takes multiple seconds to display.
So, I implemented ILazyContentProvider and not using "ArrayContentProvider" but now I am facing issues in filtering the elements of TableViewer.

I am writing the below code for filtering but the select method is not running at all.

   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));
            }
    }

The below ContentProvider, I am writting

  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);
        }

    }

Can someone please guide me how can I do the filteration of elements in TableViewer with SWT.VIRTUAL?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

早茶月光 2025-02-01 10:02:03

当使用swt.virtual时,TableViewer不支持过滤。相反,您必须在内容提供商中进行过滤。

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

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列表,这在update> updateElement中使用。

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

过滤器流中的.tolist()方法需要Java 16,适用于Java的较旧版本.Collect(collectors.tolist())

TableViewer does not support filtering when SWT.VIRTUAL is used. Instead you must do the filtering in the content provider.

The content provider will need to maintain a filtered list of elements. For example:

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();
  }
}

Here I have added a filteredElements list that contains just the current filtered elements, this is used in updateElement.

I added a filter method which updates the filtered elements list. It also tells the table viewer about the new item count and refreshes the table.

The .toList() method in the filter stream requires Java 16, for older versions of Java use .collect(Collectors.toList()).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文