【发布时间】:2014-07-02 06:17:19
【问题描述】:
我想为TableViewer 添加一个过滤器。表可能很大,所以这可能需要一段时间。添加过滤器时,我想显示进度条,以便通知用户有任务正在进行。我无法直接在IRunnableWithProgress 类中访问TableViewer,所以我使用Runnable 和Display.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