我使用swt创建了一个列表,其中显示了动物列表:猫,狗,骆驼,大象。现在我需要搜索一个特定的动物前狗搜索coloumn,只有那个动物必须显示在列表中。所以如何使用jface这样做。我是jface的新手,请帮我搜索列表。
答案 0 :(得分:1)
所有JFace Viewer
支持ViewerFilter
。 Here是关于它们的好教程。
这是一个非常基本的示例,可以向您展示如何使用ViewerFilter
s:
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new GridLayout(1, false));
List<String> input = new ArrayList<>();
input.add("Dodo");
input.add("Unicorn");
final MyFilter filter = new MyFilter();
final ListViewer viewer = new ListViewer(shell);
viewer.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
viewer.setContentProvider(new ArrayContentProvider());
viewer.setInput(input);
viewer.addFilter(filter);
Text text = new Text(shell, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
text.addListener(SWT.Verify, new Listener()
{
@Override
public void handleEvent(Event e)
{
final String oldS = ((Text) e.widget).getText();
final String newS = oldS.substring(0, e.start) + e.text + oldS.substring(e.end);
filter.setSearchText(newS);
viewer.refresh();
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
private static class MyFilter extends ViewerFilter
{
private String searchString;
public void setSearchText(String s)
{
this.searchString = ".*" + s + ".*";
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element)
{
if (searchString == null || searchString.length() == 0)
{
return true;
}
String p = (String) element;
if (p.matches(searchString))
{
return true;
}
return false;
}
}
看起来像这样:
过滤前
过滤后