Java 如何使用jface在列表中搜索所需元素
我使用swt创建了一个列表,其中显示了动物的列表,例如:猫、狗、骆驼、大象。现在,我需要在搜索栏中搜索特定的动物前犬,并且只有该动物必须显示在列表中。因此,如何使用jface完成此操作。我是jface的新手,请帮助我搜索列表。所有jfaceJava 如何使用jface在列表中搜索所需元素,java,swt,jface,Java,Swt,Jface,我使用swt创建了一个列表,其中显示了动物的列表,例如:猫、狗、骆驼、大象。现在,我需要在搜索栏中搜索特定的动物前犬,并且只有该动物必须显示在列表中。因此,如何使用jface完成此操作。我是jface的新手,请帮助我搜索列表。所有jface查看器支持查看器过滤器s。这是一个很好的教程 下面是一个非常基本的示例,它应该向您展示如何使用ViewerFilters: public static void main(String[] args) { Display display = new D
查看器支持查看器过滤器s。这是一个很好的教程
下面是一个非常基本的示例,它应该向您展示如何使用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;
}
}
publicstaticvoidmain(字符串[]args)
{
显示=新显示();
外壳=新外壳(显示);
shell.setText(“StackOverflow”);
shell.setLayout(新的GridLayout(1,false));
列表输入=新的ArrayList();
输入。添加(“Dodo”);
输入。添加(“独角兽”);
最终MyFilter过滤器=新的MyFilter();
最终ListViewer=新ListViewer(外壳);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true));
setContentProvider(新的ArrayContentProvider());
viewer.setInput(输入);
viewer.addFilter(filter);
Text Text=新文本(shell、SWT.BORDER);
setLayoutData(新的GridData(SWT.FILL,SWT.beging,true,false));
text.addListener(SWT.Verify,new Listener())
{
@凌驾
公共无效handleEvent(事件e)
{
最终字符串oldS=((Text)e.widget).getText();
最终字符串newS=oldS.substring(0,e.start)+e.text+oldS.substring(e.end);
filter.setSearchText(新闻);
viewer.refresh();
}
});
shell.pack();
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
私有静态类MyFilter扩展了ViewerFilter
{
私有字符串搜索字符串;
public void setSearchText(字符串s)
{
this.searchString=“*”+s+”*”;
}
@凌驾
公共布尔选择(查看器、对象父元素、对象元素)
{
if(searchString==null | | searchString.length()==0)
{
返回true;
}
字符串p=(字符串)元素;
if(p.matches(searchString))
{
返回true;
}
返回false;
}
}
看起来像这样:
过滤前
过滤后