我有一个包含很多行的JFaceTableViewer。我之前通过使用JPA获取的这些行。我已经将提取放在另一个线程中,以便在获取时显示进度并且它有效。
现在我在每个列上放置了一个SelectionAdapter,以允许对该列进行排序。这是代码:
private SelectionAdapter getSelectionAdapter(final TableColumn column, final String colName) {
SelectionAdapter selectionAdapter = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
comparator.setColumnName(colName);
int dir = comparator.getDirection();
resultTableViewer.getTable().setSortDirection(dir);
resultTableViewer.getTable().setSortColumn(column);
resultTableViewer.refresh();
}
};
return selectionAdapter;
}
如何执行这些行以在另一个线程中进行排序以显示进度条?每次我尝试在resultTableViewer上调用方法时都会遇到异常:InvalidThreadAccess
有什么想法吗?
答案 0 :(得分:2)
您获得了无效的线程访问权限,因为您没有在UI线程中执行上面的代码,这是更新SWT小部件的要求。您可以做的是这样的事情,保留现有的方法结构,但让它在遵循此模式的UI线程中执行,您从表格小部件中获取显示,并且您将不会获得无效的线程访问异常。
text.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
StringWriter writer = new StringWriter();
for (String string : content) {
writer.append(string + "\n");
}
text.setText(writer.toString());
}
});
点击此处了解有关您的问题的更多信息:Invalid SWT Thread Access
答案 1 :(得分:2)
您已使用asyncExec();
:
Display.getDefault().asyncExec(new Runnable() {
public void run() {
// your sorting here
}
链接: