如何使用jface在列表中搜索所需的元素

时间:2014-08-11 10:35:10

标签: java swt jface

我使用swt创建了一个列表,其中显示了动物列表:猫,狗,骆驼,大象。现在我需要搜索一个特定的动物前狗搜索coloumn,只有那个动物必须显示在列表中。所以如何使用jface这样做。我是jface的新手,请帮我搜索列表。

1 个答案:

答案 0 :(得分:1)

所有JFace Viewer支持ViewerFilterHere是关于它们的好教程。

这是一个非常基本的示例,可以向您展示如何使用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;
    }
}

看起来像这样:

过滤前

enter image description here

过滤后

enter image description here