В моем приложении Eclipse RCP есть виртуальная таблица. Мы обращаемся к бэкэнду, чтобы получить данные для заполнения в виртуальной таблице.
Нам нужна сортировка по умолчанию для таблицы по одному столбцу. Мы используем ViewerComparator для достижения функциональности сортировки. Моя проблема в том, что я не могу заставить эту сортировку работать, когда таблица загружается с данными в первый раз. Но когда я нажимаю на столбец, все работает нормально, как и ожидалось.
Вот так я установил Comparator в столбец
TableViewerColumn tvc = viewer.addColumn(100, SWT.LEFT, "Name");
viewer.setColumnComparator(tvc,
new Comparator<Person>() {
@Override
public int compare(Person o1,Person o2) {
double firstValue = Double.parseDouble(o1
.getAge());
double secondValue = Double.parseDouble(o2
.getAge());
return firstValue > secondValue ? 1 : -1;
}
});
метод setColumnComparator в пользовательском средстве просмотра
public void setColumnComparator(TableViewerColumn tvc, Comparator<T> cmp){
final MyViewerComparator c = new MyViewerComparator(cmp);
final TableColumn tc = tvc.getColumn();
setComparator(c);
getTable().setSortDirection(c.getDirection());
getTable().setSortColumn(tc);
refresh();
tc.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
<same code as above>
}
});
MyViewerComparator
class MyViewerComparator extends ViewerComparator{
Comparator<T> cmp;
boolean desc = true;
MyViewerComparator(Comparator<T> cmp){
this.cmp = cmp;
}
int getDirection(){
return desc?SWT.UP:SWT.DOWN;
}
void flipDirection(){
desc = !desc;
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
если (e1 == ноль || e2 == ноль) {
return 0;
}
int rc = cmp.compare((T)e1, (T)e2);
if(desc)
return -rc;
return rc;
}
}
Когда таблица загружает данные в первый раз, она входит в условие полужирным шрифтом в вышеприведенном коде, поскольку один из объектов равен ВСЕГДА NULL
Примечание: Эта функция работает совершенно нормально, если я использую стандартную таблицу, а не VIRTUAL TABLE. Я не уверен, смогу ли я изменить его, чтобы использовать стандартную таблицу, так как мы также хотим использовать функцию отложенной загрузки.
ContentProvider используется: ObservableListContentProvider
Пожалуйста, сообщите ..