我有一个带有ViewerComparator的JFace TableViewer。排序的方向和列在表的选择侦听器上设置。这很好用。
但是,我最近将LabelProvider从DelegatingStyledCellLabelProvider
更改为DecoratingStyledCellLabelProvider
。在我进行了更改后,表格似乎正在排序 - 列突出显示,方向箭头添加到列标题中。第一列按照我期望的方式按照排序列的值进行排序,但其余行不随之移动。
这是我尝试排序之前表的外观。注意第一列相对于其他值的值。
我排序后。看第二列的值是如何按照它们之前的顺序排列的,即使第一列是按字母顺序排列的?
我添加DecoratingStyledCellLabelProvider
的代码如下:
column.setLabelProvider(
new DecoratingStyledCellLabelProvider(
new MyStyledCellLabelProvider(),
MyPlugin.getDefault().getWorkbench().getDecoratorManager(),
null ) );
编辑添加比较代码
@Override
public int compare( final Viewer viewer, final Object e1, final Object e2 ) {
if( !( e1 instanceof TreeElement<?> && e2 instanceof TreeElement<?> ) ) {
return super.compare(viewer, e1, e2);
}
if(this.sortDirection == SortDirection.NONE) {
return ((TreeElement<?>) e1).getSortIndex() - ((TreeElement<?>) e2).getSortIndex();
}
final IBaseLabelProvider labelProvider = ((ColumnViewer) viewer).getLabelProvider(this.columnNumber);
if( !(labelProvider instanceof DelegatingStyledCellLabelProvider) ) {
return super.compare(viewer, e1, e2);
}
final IStyledLabelProvider columnLabelProvider = ((DelegatingStyledCellLabelProvider) labelProvider).getStyledStringProvider();
final TreeElement<?> treeElement1 = (TreeElement<?>) e1;
final String text1 = columnLabelProvider.getStyledText(treeElement1).getString();
final TreeElement<?> treeElement2 = (TreeElement<?>) e2;
final String text2 = columnLabelProvider.getStyledText(treeElement2).getString();
// either one could be null
int result;
if(text1 == null) {
result = text2 == null ?
0 : // both null, so they're the same
1; // only text1 is null, so text2 is greater
} else {
result = text2 == null ?
-1 : // only text2 is null, so text1 is greater
text1.compareToIgnoreCase(text2); // both not null - do a real text compare
}
// If descending order, flip the direction
return this.sortDirection == SortDirection.DESCENDING ? -result : result;
}
编辑2:添加标签提供者代码。
我的标签提供商扩展了ColumnLabelProvider
并实施了IStyledLabelProvider
@Override
public StyledString getStyledText(final Object element) {
if( !(element instanceof TreeElement<?>) ) {
return null;
}
final String elemText = getText(element);
final StyledString styledString = new StyledString(elemText == null ? "" : elemText);
if( !(element instanceof MyElement<?,?>) ) {
return styledString;
}
// apply styles as needed
return styledString;
}
编辑3:决议
我无法解决问题。然而,由于我能够改变设计,因此无论如何我都不需要DecoratingStyledCellLableProvider,因此它没有实际意义。谢谢你的帮助!