我有一个SWT表,我与JFace TableViewer
一起使用。
我希望使用比较器对表进行排序,该比较器使用表格单元格中的文本,而不是查看器中的模型元素。
这样做有什么好办法吗?
我正在尝试这样做,因为在单元格文本上对表进行排序几乎适用于所有情况,这使我不必为每个我希望能够排序的模型对象属性创建单独的比较器。 / p>
问题是表通常使用查看器上的ViewerComparator
集进行排序。其compare
方法无法访问其参数元素表中的位置:
new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object elem1, Object elem2) {
// There seems to be no good way to get the
// text of the table cells here
}
}
ViewerComparator#compare
在StructuredViewer#findItem
中查找单元格小部件。这可能有效,但我必须对所有观众进行子类化以使该方法公开。ViewerComparator#compare
中的标签提供程序将比较的元素转换为字符串。这不起作用,因为我使用的大多数标签提供商都是CellLabelProvider
,我找不到在其上调用update
来获取表格文本的方法。答案 0 :(得分:0)
您可以让您的细胞标签提供者实施ILabelProvider
,使其具有getText
方法。
您可以查看具有类似问题的getTextFromLabelProvider
org.eclipse.e4.ui.dialogs.filteredtree.PatternFilter
方法:
private String getTextFromLabelProvider(IBaseLabelProvider baseLabelProvider, Object element) {
if (baseLabelProvider == null) {
return null;
}
String labelText = null;
if (baseLabelProvider instanceof ILabelProvider) {
labelText = ((ILabelProvider) baseLabelProvider).getText(element);
} else if (baseLabelProvider instanceof IStyledLabelProvider) {
labelText = ((IStyledLabelProvider) baseLabelProvider).getStyledText(element).getString();
} else if (baseLabelProvider instanceof DelegatingStyledCellLabelProvider) {
IStyledLabelProvider styledStringProvider = ((DelegatingStyledCellLabelProvider) baseLabelProvider)
.getStyledStringProvider();
StyledString styledText = styledStringProvider.getStyledText(element);
if (styledText != null) {
labelText = styledText.getString();
}
}
return labelText;
}