【问题标题】:NatTable - Strange behavior when sortingNatTable - 排序时的奇怪行为
【发布时间】:2016-11-25 00:18:34
【问题描述】:

我有一个具有排序/过滤功能的 nattable,基于 http://www.eclipse.org/nattable/documentation.php?page=sorting 和示例 6031_GlazedListsFilterExample.java

最初我的表有零行。

场景 1:

  • 我查看了一个 CTabItem,其中包含一个没有行的 NatTable。
  • 如果我随后填充行并单击列标题,则没有任何反应(排序似乎已禁用)。

场景 2:

  • 我没有查看包含没有行的 NatTable 的 CTabItem。
  • 然后我填充行
  • 然后我查看包含 NatTable 的 CTabItem,该 NatTable 现在有行。
  • 我单击列标题,一切都按预期排序(排序似乎已启用)

场景 3:

  • 我没有查看包含没有行的 NatTable 的 CTabItem。
  • 然后我填充行
  • 然后我查看包含 NatTable 的 CTabItem,该 NatTable 现在有行。
  • 然后我删除所有行数据
  • 我单击列标题,一切都按预期排序(排序似乎已启用)。 * 即使没有行,我仍然会在列标题单元格中看到向上/向下图标

是否存在在 NatTable 的初始“视图”之后未“更新”列标题操作的原因?换句话说,在第一次查看 NatTable 之后,无论行是否更改,它似乎都考虑了行的存在/不存在。

相关代码部分如下所示:

private CompositeLayer createExampleLayer(Collection<T> values, 
  IColumnPropertyAccessor<T> columnPropertyAccessor,
  IDataProvider columnHeaderDataProvider, IConfigRegistry 
  configRegistry, Matcher<T> matcher) {
    BodyLayerStack<T> bodyLayerStack = new BodyLayerStack<>(
      values, columnPropertyAccessor);

    // build the column header layer
    DataLayer columnHeaderDataLayer = new 
      DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
    ILayer columnHeaderLayer = new 
      ColumnHeaderLayer(columnHeaderDataLayer, bodyLayerStack,
      bodyLayerStack.getSelectionLayer());

    SortHeaderLayer<T> sortHeaderLayer = new SortHeaderLayer<>
      (columnHeaderLayer, new GlazedListsSortModel<T>
      (bodyLayerStack.getSortedList(), columnPropertyAccessor, 
      configRegistry,                      
      bodyLayerStack.getBodyDataLayer()), false);

    FilterRowHeaderComposite<T> filterRowHeaderLayer = new 
      FilterRowHeaderComposite<>(
        new DefaultGlazedListsFilterStrategy<T>
         (bodyLayerStack.getFilterList(), columnPropertyAccessor,
         configRegistry),
       sortHeaderLayer, columnHeaderDataLayer.getDataProvider(), 
       configRegistry);

    // Omitted code for rowHeaderLayer and cornerLayer
    return new GridLayer(bodyLayerStack, filterRowHeaderLayer, 
    rowHeaderLayer, cornerLayer);
}

public BodyLayerStack(Collection<T> values, 
  IColumnPropertyAccessor<T> columnPropertyAccessor) {
    eventList = GlazedLists.eventList(values);

    TransformedList<T, T> rowObjectsGlazedList = 
      GlazedLists.threadSafeList(eventList);

    this.sortedList = new SortedList<>(rowObjectsGlazedList, null);

    // wrap the SortedList with the FilterList
    this.filterList = new FilterList<>(sortedList);
    this.bodyDataProvider = new ListDataProvider<>(this.filterList, 
      columnPropertyAccessor);
    this.bodyDataLayer = new DataLayer(getBodyDataProvider());

    // layer for event handling of GlazedLists and PropertyChanges
    GlazedListsEventLayer<T> glazedListsEventLayer = new 
      GlazedListsEventLayer<>(bodyDataLayer, this.filterList);

    this.selectionLayer = new SelectionLayer(glazedListsEventLayer);
    ViewportLayer viewportLayer = new ViewportLayer(getSelectionLayer());

    setUnderlyingLayer(viewportLayer);
}

private void enableSorting() {
    this.nattable.addConfiguration(new SingleClickSortConfiguration());
}

【问题讨论】:

  • 如何填充数据?
  • 锁定事件列表并将其直接添加到该事件列表中
  • 什么是初始值列表?一个空列表还是 null?
  • 一个空列表。谢谢!
  • eventList = GlazedLists.eventList(new LinkedBlockingDeque());

标签: nattable


【解决方案1】:

您的SortHeaderLayer 的创建似乎不正确。 GlazedListsSortModel的最后一个参数需要是列标题的IDataLayer,而不是body层。

将您的代码更改为以下内容应该可以正常工作。至少在我这边是这样。

SortHeaderLayer<T> sortHeaderLayer = new SortHeaderLayer<>
  (columnHeaderLayer, new GlazedListsSortModel<T>
  (bodyLayerStack.getSortedList(), columnPropertyAccessor, 
  configRegistry,                      
  columnHeaderDataLayer), false);

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2012-12-17
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2019-01-18
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多