#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. Спасибо за ответ . Но проблема не в сортировке. Сортировка работает отлично. Это проблема с выбором таблицы после сортировки. Как упоминалось в вопросе, выбор элемента дает другой объект модели, а не выбранный. Может ли сортировка никогда не выполняться для таблицы с установленным виртуальным флагом?