当前位置: 首页 > 知识库问答 >
问题:

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

盖和洽
2023-03-14

在eclipse RCP应用程序中,我有一个具有VIRTUAL样式的桌面浏览器,用于显示大量数据。

我正在使用自定义内容提供程序实现IStructuredContentProvider

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

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

假设以下项目按顺序显示在视图上

  • A
  • B
  • C
  • D
  • E

单击特定列后,视图按下面提到的顺序排序

  • E

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

看起来模型没有使用排序的数据更新,因此不匹配。似乎排序只在UI上完成,模型没有相应地更新。

你能帮我解决这个问题吗?

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

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

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

自定义TableClonSorter类如下所示

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

宰坚
2023-03-14

从JavaDoc for TableViewer

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

 类似资料:
  • 当我尝试创建复合表列时出错?

  • 在一个工具中,我正在做,我有一个表格,我像这样添加: 效果很好,但现在,我想添加一个JFace表查看器,但是上面的文档似乎只关注表布局,而不是表。我以为,桌面视图会被添加到表中吗?

  • 我有一个5列的表查看器。在第一列中,我检查了一些条件并添加了一个图像,其余的列将有文本,但当我尝试添加图像,然后用文本添加其余的列时,第二列的文本就位于第一列中的图像旁边。下面是我的示例代码片段: 问题是字符串“street”位于第一列中图像的右侧,但我希望字符串“street”位于第二列中,其余字符串位于后续列中。我做错了什么?如何从第二列添加表项?

  • 本文向大家介绍选择排序,包括了选择排序的使用技巧和注意事项,需要的朋友参考一下 在选择排序技术中,列表分为两部分。一部分将所有元素排序,而另一部分将未排序项目。首先,我们从数组中获取最大或最小数据。获得数据(例如最小值)后,我们将列表中的第一位数据替换为最小数据,从而将其放置在列表的开头。执行后,数组变得越来越小。这样就完成了这种分类技术。 选择排序技术的复杂性 时间复杂度:O(n ^ 2) 空间

  • 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。 1. 算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 2. 动图演示 3. JavaScript 代

  • 1. 前言 本节内容是排序算法系列之一:选择排序,主要讲解了选择排序的主体思路,选取了一个待排序的数字列表对选择排序算法进行了演示,给出了选择排序算法的 Java 代码实现,帮助大家可以更好的理解选择排序算法。 2. 什么是选择排序? 选择排序(Select Sort),是计算机科学与技术领域中较为简单的一种排序算法。 假设我们按照从小到大的顺序进行排序。选择排序会首先从待排序序列中选择一个最小的