排序后的JFace表查看器选择问题

时间:2014-07-01 01:00:08

标签: java swt eclipse-rcp jface tableviewer

在日食RCP应用程序中,我有一个带有VIRTUAL样式的tableviewer,用于绘制大量数据。

我正在使用实现IStructuredContentProvider&的自定义内容提供商。自定义表查看器,将ITableLabelProvider实现为表查看器的一部分..

我需要通过所有列对表数据进行排序。

排序适用于所有列。但是,我在表上有一个选择事件,并且有一些基于表选择的操作。

让我们说以下项目按顺序显示在视图上

  • A
  • C
  • d
  • 电子

单击特定列后,视图按以下顺序排序

  • 电子
  • d
  • C
  • A

但是,在选择E(表格的第1项)时,会加载项目A的详细信息,而不是项目E的详细信息。

看起来模型没有使用排序数据更新,因此不匹配。似乎只在UI上进行排序,并且模型没有相应更新。

你可以帮帮我吗?

我不希望编写自定义比较器并编写与标签提供程序的getColumnText中的一部分相同的逻辑,以对各列进行排序并使用该比较器对模型进行排序。

注意:如果我取出VIRTUAL样式并检查所选项目,它的效果非常好。所选项目的详细信息按预期加载。

PFB,用于在我的应用程序中进行排序的代码片段。

TableColumnSorter cSorter = new TableColumnSorter(tabViewer, column.getColumn()) {
        protected int doCompare(Viewer v, Object e1, Object e2) {
                ITableLabelProvider lp = ((ITableLabelProvider) tabViewer
                .getLabelProvider());
                String t1 = lp.getColumnText(e1, colIdx);
                String t2 = lp.getColumnText(e2, colIdx);

                return t1.compareTo(t2);
        }
};

cSorter.setSorter(cSorter, TableColumnSorter.ASC);

自定义TableColumnSorter类如下

abstract class TableColumnSorter extends ViewerComparator {

    public static final int ASC = 1;

    public static final int NONE = 0;

    public static final int DESC = -1;

    private int direction = 0;

    private TableColumn column;

    private TableViewer viewer;

    public TableColumnSorter(TableViewer viewer, TableColumn column) {
            this.column = column;
            this.viewer = viewer;
            this.column.addSelectionListener(new SelectionAdapter() {

                    public void widgetSelected(SelectionEvent e) {
                            if (TableColumnSorter.this.viewer.getComparator() != null) {
                                    if (TableColumnSorter.this.viewer.getComparator() == TableColumnSorter.this) {
                                            int tdirection = TableColumnSorter.this.direction;

                                            if (tdirection == ASC) {
                                                    setSorter(TableColumnSorter.this, DESC);
                                            } else if (tdirection == DESC) {
                                                    setSorter(TableColumnSorter.this, ASC);
                                            }
                                    } else {
                                            setSorter(TableColumnSorter.this, ASC);
                                    }
                            } else {
                                    setSorter(TableColumnSorter.this, ASC);
                            }
                    }
            });
    }

    public void setSorter(TableColumnSorter sorter, int direction) {
            if (direction == NONE) {
                    column.getParent().setSortColumn(null);
                    column.getParent().setSortDirection(SWT.NONE);
                    viewer.setComparator(null);
            } else {
                    column.getParent().setSortColumn(column);
                    sorter.direction = direction;

                    if (direction == ASC) {
                            column.getParent().setSortDirection(SWT.DOWN);
                    } else {
                            column.getParent().setSortDirection(SWT.UP);
                    }

                    if (viewer.getComparator() == sorter) {
                            viewer.refresh();
                    } else {
                            viewer.setComparator(sorter);
                    }

            }
    }

    public int compare(Viewer viewer, Object e1, Object e2) {
            return direction * doCompare(viewer, e1, e2);
    }

    protected abstract int doCompare(Viewer TableViewer, Object e1, Object e2); 
}

1 个答案:

答案 0 :(得分:3)

来自TableViewer

的JavaDoc
  

TableViewer现在支持SWT.VIRTUAL标志。如果是基础表   是SWT.VIRTUAL,内容提供商可以实现   ILazyContentProvider而不是IStructuredContentProvider。 请注意   在这种情况下,查看器不支持排序或过滤。