1

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

有任何想法吗?

4

2 回答 2

2

你必须这样做asyncExec();

    Display.getDefault().asyncExec(new Runnable() {
       public void run() {
          // your sorting here
       }

链接:

于 2012-11-21T06:55:00.427 回答
2

您正在获得无效的线程访问,因为您没有在 UI 线程中执行上面的代码,这是更新 SWT 小部件的要求。您可以做的是这样的事情,保留现有的方法结构,但让它在遵循此模式的 UI 线程中执行,您从表格小部件中获取 Display 并且您不会得到无效的线程访问异常。

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

在此处查看有关您的问题的更多信息:无效的 SWT 线程访问

于 2012-11-21T06:53:52.493 回答