Eclipse plugin 在添加decormingStyledCellLabelProvider后,我的TableViewer排序不正确

Eclipse plugin 在添加decormingStyledCellLabelProvider后,我的TableViewer排序不正确,eclipse-plugin,eclipse-rcp,Eclipse Plugin,Eclipse Rcp,我有一个JFace TableViewer和一个ViewerComparator。排序的方向和列在表的选择侦听器上设置。这个很好用 但是,我最近将我的LabelProvider从DelegatingStyledCellLabelProvider更改为DecoratingStyledCellLabelProvider。在我做了更改之后,表似乎正在排序——列被高亮显示,方向箭头被添加到列标题中。第一列根据排序列的值按我所期望的方式进行排序,但其余行不会随之移动 这是我尝试排序之前表格的外观。请注意第

我有一个JFace TableViewer和一个ViewerComparator。排序的方向和列在表的选择侦听器上设置。这个很好用

但是,我最近将我的LabelProvider从
DelegatingStyledCellLabelProvider
更改为
DecoratingStyledCellLabelProvider
。在我做了更改之后,表似乎正在排序——列被高亮显示,方向箭头被添加到列标题中。第一列根据排序列的值按我所期望的方式进行排序,但其余行不会随之移动

这是我尝试排序之前表格的外观。请注意第一列相对于其他值的值

在我分类之后。查看第二列的值是如何按照与以前相同的顺序排列的,即使第一列是按字母顺序排列的

我添加
装饰样式CellLabelProvider
的代码如下:

column.setLabelProvider(
新装饰样式CellLabelProvider(
新建MyStyledCellLabelProvider(),
MyPlugin.getDefault().getWorkbench().getDecoratorManager(),
空);
编辑以添加比较代码

@覆盖
公共整数比较(最终查看器、最终对象e1、最终对象e2){
if(!(树元素的e1实例和树元素的e2实例)){
返回super.compare(查看器、e1、e2);
}
if(this.sortDirection==sortDirection.NONE){
return((TreeElement)e1.getSortIndex()-((TreeElement)e2.getSortIndex();
}
最终IBaseLabelProvider labelProvider=((ColumnViewer)查看器).getLabelProvider(this.columnNumber);
if(!(labelProvider实例of DelegatingStyledCellLabelProvider)){
返回super.compare(查看器、e1、e2);
}
最终IStyledLabelProvider columnLabelProvider=((DelegatingStyledCellLabelProvider)labelProvider).getStyledStringProvider();
最终TreeElement treeElement1=(TreeElement)e1;
final String text1=columnLabelProvider.getStyledText(treeElement1.getString();
最终树元素树元素2=(树元素)e2;
最终字符串text2=columnLabelProvider.getStyledText(treeElement2.getString();
//任何一个都可以为空
int结果;
如果(text1==null){
结果=text2==null?
0://都为null,因此它们是相同的
1、 //只有text1为null,因此text2更大
}否则{
结果=text2==null?
-1://只有text2为空,因此text1更大
text1.compareToIgnoreCase(text2);//两者都不为null-进行真正的文本比较
}
//如果按降序排列,则翻转方向
返回this.sortDirection==sortDirection.DESCENDING?-结果:结果;
}
编辑2:添加标签提供程序代码。 My label provider扩展了
ColumnLabelProvider
并实现了
IstyleLabelProvider

@覆盖
公共样式字符串getStyledText(最终对象元素){
if(!(TreeElement的元素实例)){
返回null;
}
最终字符串elemText=getText(元素);
final StyledString StyledString=新StyledString(elemText==null?“:elemText);
if(!(MyElement的元素实例)){
返回样式字符串;
}
//根据需要应用样式
返回样式字符串;
}
编辑3:分辨率


我没能解决这个问题。然而,这变得毫无意义,因为我能够在设计上做出改变,所以我无论如何都不需要装饰风格的CelllableProvider。谢谢你的帮助

您必须向我们展示您完成排序的代码。谢谢你的评论,这类看起来可能还可以。第二列的标签提供程序如何?我的标签提供程序对于所有列都是相同的。实际上,我将列索引传递给构造函数,然后根据列索引获取文本。逻辑有点复杂,我不确定我是否能将它简化到可以在这里发布。有什么具体的东西我可以找吗?我找到了一个简化的方法。发布标签提供程序的getStyledText()部分。您必须向我们显示完成排序的代码。谢谢你的评论,这类看起来可能还可以。第二列的标签提供程序如何?我的标签提供程序对于所有列都是相同的。实际上,我将列索引传递给构造函数,然后根据列索引获取文本。逻辑有点复杂,我不确定我是否能将它简化到可以在这里发布。有什么具体的东西我可以找吗?我找到了一个简化的方法。发布标签提供程序的getStyledText()部分。