使用自定义比较器进行 NatTable 排序

NatTable sorting with custom comparator

我正在查看 (509_SortHeaderLayer.java) 示例作为参考点。

我将自定义比较器直接添加到 SortedList,如下例所示。但是,当我单击调试器中的列时,我的自定义比较器从未到达我在 compare() 方法的第一行中设置的断点。

如果我将比较器添加为 AbstractRegistryConfiguration,它会按预期工作(当我单击列时到达断点)。

为什么在 SortedLists 构造函数中设置比较器不能像我预期的那样工作?一些通用的代码片段如下所示:

public void setSortComparatorWorks() {
    SortedList<T> sortedList = new SortedList<>(eventList, null);
    init(sortedList);
    getNatTable().addConfiguration(new AbstractRegistryConfiguration() {

        @Override
        public void configureRegistry(IConfigRegistry configRegistry) {
            configRegistry.registerConfigAttribute(SortConfigAttributes.
              SORT_COMPARATOR, new MyComparator<T>(),  
              DisplayMode.NORMAL);
        }
    });
    getNatTable().configure();
}

public void setSortComparatorDoesntWork() {
    SortedList<T> sortedList = new SortedList<>(eventList, 
      new MyComparator<T>);
    init(sortedList);
    getNatTable().configure();
}

private void init(SortedList sortedList){
    this.bodyDataProvider = new ListDataProvider<>(sortedList, 
      columnPropertyAccessor);

    this.bodyDataLayer = new DataLayer(this.bodyDataProvider);

    this.bodyLayerStack = new DefaultBodyLayerStack(new 
      GlazedListsEventLayer<>(this.bodyDataLayer, eventList));

    this.columnHeaderLayerStack = new 
      GlazedListsColumnHeaderLayerStack<>(
        columnHeaderDataProvider, sortedList,
        columnPropertyAccessor, configRegistry, this.bodyLayerStack);

    this.sortHeaderLayer = new SortHeaderLayer<>(columnHeaderLayerStack,
      new GlazedListsSortModel<T>(sortedList, 
      columnPropertyAccessor, configRegistry, bodyDataLayer),
      false);

    setChildLayer(GridRegion.COLUMN_HEADER, sortHeaderLayer, 0, 0);
    setChildLayer(GridRegion.BODY, bodyLayerStack, 0, 1);

    getNatTable().addConfiguration(new SingleClickSortConfiguration());
}

它没有像您预期的那样工作,因为内部函数会将 SortedList 上的任何现有 Comparator 替换为派生自 ConfigRegistryComparator ] 和当前应用的排序状态。

顺便说一句,有趣的是你提到了 _509_SortHeaderLayerExample 而 GlazedLists 的例子是 _602_GlazedListsSortingExample.