【问题标题】:JFace TableViewer sorting in another threadJFace TableViewer 在另一个线程中排序
【发布时间】:2012-11-21 15:05:10
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • @WildDogSmith:欢迎来到 StackOverflow。人们试图回答你的问题。如果其中一个解决了您的问题,您应该通过选中答案旁边的复选标记来告知作者。

标签: java eclipse swt jface rcp


【解决方案1】:

您正在获得无效的线程访问,因为您没有在 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());
        }
    });

在此处查看有关您的问题的更多信息:Invalid SWT Thread Access

【讨论】:

    【解决方案2】:

    你必须通过asyncExec();来做到这一点:

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

    链接:

    【讨论】:

    • 有趣的是,我们都粘贴了相同的 URL,但链接不正确。
    • 修复了我帖子中的链接:s/?/%3F/ :-)
    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多