我想为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();
}
}
答案 0 :(得分:3)
Display.syncExec
运行UI线程中的代码,但进度对话框需要代码在后台线程中运行,所以这不会起作用。
对于大型表,您应该查看表的SWT.VIRTUAL
标志,并使用实现ILazyContentProvider
的内容提供程序。
但是,ILazyContentProvider
的虚拟表不支持过滤器或排序,因此您必须自己在内容提供商中执行此操作。
现有的类DeferredContentProvider
尝试为虚拟表提供过滤和排序,但请参阅this question以获取此类问题的链接。