【问题标题】:Eclipse plugin add Filter to TableViewer in IRunnableWithProgressEclipse 插件在 IRunnableWithProgress 中将过滤器添加到 TableViewer
【发布时间】:2014-07-02 06:17:19
【问题描述】:

我想为TableViewer 添加一个过滤器。表可能很大,所以这可能需要一段时间。添加过滤器时,我想显示进度条,以便通知用户有任务正在进行。我无法直接在IRunnableWithProgress 类中访问TableViewer,所以我使用RunnableDisplay.getDefault().syncExec

问题是进度条没有显示并且整个 UI 没有响应。

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();
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以我调查了这个。使用DeferredContentProvider 进行过滤不如使用tableViewerself 灵活。我一次使用多个过滤器,可以使用addFilter 轻松地将其添加到表格中,这使得延迟加载对于大表格更加合理。这令人沮丧。除了使用ILazyContentProvider并自行管理过滤之外,我没有其他办法:(
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2013-06-18
    • 2019-10-14
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多