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

#java #swt #eclipse-rcp #jface #tableviewer

#java #swt #eclipse-rcp #jface #средство просмотра таблиц

Вопрос:

В приложении 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); 
}
  

Ответ №1:

Из JavaDoc для TableViewer

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

Комментарии:

1. Спасибо за ответ . Но проблема не в сортировке. Сортировка работает отлично. Это проблема с выбором таблицы после сортировки. Как упоминалось в вопросе, выбор элемента дает другой объект модели, а не выбранный. Может ли сортировка никогда не выполняться для таблицы с установленным виртуальным флагом?