JFace TableViewer在另一个线程中排序

时间:2012-11-21 06:46:28

标签: java eclipse swt jface rcp

我有一个包含很多行的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

有什么想法吗?

2 个答案:

答案 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
       }

链接: