在单元格文本上对SWT表进行排序

时间:2018-04-17 07:19:44

标签: swt jface

我有一个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#compareStructuredViewer#findItem中查找单元格小部件。这可能有效,但我必须对所有观众进行子类化以使该方法公开。
  • 使用ViewerComparator#compare中的标签提供程序将比较的元素转换为字符串。这不起作用,因为我使用的大多数标签提供商都是CellLabelProvider,我找不到在其上调用update来获取表格文本的方法。

1 个答案:

答案 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;
}