如何用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())
.
在我的项目中,我有一个 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())
.