Проблема с выбором JFace Table Viewer после сортировки

В приложении eclipse RCP у меня есть средство просмотра таблиц с ВИРТУАЛЬНЫМ стилем для отображения большого количества данных.

Я использую пользовательский поставщик контента, реализующий IStructuredContentProvider, и пользовательское средство просмотра таблиц, реализующее ITableLabelProvider как часть средства просмотра таблиц.

У меня есть требование отсортировать данные таблицы по всем столбцам.

Сортировка работает отлично для всех столбцов. Однако у меня есть событие выбора в таблице, и есть некоторые операции, основанные на выборе таблицы.

Допустим, следующие элементы отображаются в представлении в порядке

  • A
  • B
  • C
  • D
  • E

После нажатия на конкретный столбец представление сортируется в указанном ниже порядке.

  • E
  • D
  • C
  • B
  • A

Но при выборе E (1-й элемент таблицы) загружаются сведения об элементе A, а не о элементе E.

Похоже, что модель не обновляется отсортированными данными и, следовательно, несоответствие. Кажется, что сортировка выполняется только в пользовательском интерфейсе, и модель соответственно не обновляется.

Не могли бы вы помочь мне в этом?

Я не хочу писать собственный компаратор и писать ту же логику, написанную как часть в 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);

Пользовательский класс 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); 
}

person user1166031    schedule 01.07.2014    source источник


Ответы (1)


Из JavaDoc для TableViewer

TableViewer теперь поддерживает флаг SWT.VIRTUAL. Если базовой таблицей является SWT.VIRTUAL, поставщик контента может реализовать ILazyContentProvider вместо IStructuredContentProvider. Обратите внимание, что в этом случае средство просмотра не поддерживает сортировку или фильтрацию.

person greg-449    schedule 01.07.2014
comment
Спасибо за ответ . Но проблема не в сортировке. Сортировка работает идеально. Это проблема с выбором таблицы после сортировки. Как упоминалось в вопросе, выбор элемента дает другой объект модели, а не выбранный. Можно ли никогда не выполнять сортировку для таблицы с установленным виртуальным флагом? - person user1166031; 03.07.2014