Eclipse插件在IRunnableWithProgress中将Filter添加到TableViewer

时间:2014-07-02 06:17:20

标签: java eclipse-plugin swt eclipse-rcp tableviewer

我想为TableViewer添加过滤器。表可能很大,因此可能需要一段时间。添加过滤器时,我想显示进度条,以便用户被告知正在进行任务。我无法直接在TableViewer课程中访问IRunnableWithProgress,因此我使用Runnable Display.getDefault().syncExec

问题是进度条没有显示,完整的用户界面没有响应。

public class SearchFilter extends IViewerFilter {

    public SearchFilter(String filterName){
        super(filterName);
    }

    //Filtert die Tabelle nach eingabe des Suchfelds

    @Override
    public boolean select(Viewer viewer, Object parentElement, Object element) {

        //wird für jedes Element in der Tabelle(Paket) aufgerufen

        PacketDecoder packet = (PacketDecoder) element;
        String tmpData = packet.getDecodedData().toLowerCase();

        //falls Paket nicht decodierbar ist
        if(tmpData == null || tmpData.equals(""))
            return false;

        if(tmpData.contains(searchText.toLowerCase()))
            return true;

        return false;
    }
}

class EnterListener implements TraverseListener {

    @Override
    public void keyTraversed(TraverseEvent e) {

        if (e.detail == SWT.TRAVERSE_RETURN) {

if(searchText !=null && searchText.equals(text.getText()))
                return;

            searchText = text.getText();

            ProgressMonitorDialog progDialog = new ProgressMonitorDialog(parent.getShell());
            SearchProgress progress = new SearchProgress();
            try {
                progDialog.run(true, false, progress);
            } catch (InvocationTargetException ex) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            } catch (InterruptedException ex) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            }
        }
    }
}

class SearchProgress implements IRunnableWithProgress{

    @Override
    public void run(IProgressMonitor monitor)
            throws InvocationTargetException, InterruptedException {

        monitor.beginTask("entferne Filter...", IProgressMonitor.UNKNOWN);
        Display.getDefault().syncExec(new Runnable() {
            public void run() {

                searchFilter.setUsable(true);
                //Falls searchFilter zuvor nicht gefunden
                //searchFilter setzen
                if(!foundFilter) viewer.addFilter(searchFilter);
                else viewer.refresh();
            }
        });
        monitor.done();
    }
}

1 个答案:

答案 0 :(得分:3)

Display.syncExec运行UI线程中的代码,但进度对话框需要代码在后台线程中运行,所以这不会起作用。

对于大型表,您应该查看表的SWT.VIRTUAL标志,并使用实现ILazyContentProvider的内容提供程序。

但是,ILazyContentProvider的虚拟表不支持过滤器或排序,因此您必须自己在内容提供商中执行此操作。

现有的类DeferredContentProvider尝试为虚拟表提供过滤和排序,但请参阅this question以获取此类问题的链接。