首页 > 解决方案 > 在 NatTables 中排序

问题描述

我已经在 nattables 中实现了过滤。如何添加排序?我必须创建新的columnHeaderLayer吗?这是我的代码:

1班BodyLayerStack

class BodyLayerStack extends AbstractLayerTransform {

  private final FilterList<TableLine> filterList;
  private final SelectionLayer selectionLayer;
  private final DataLayer bodyDataLayer;
  private final IRowDataProvider<TableLine> bodyDataProvider;
  private final SortedList<TableLine> sortedList;
  public DataLayer getBodyDataLayer() {
    return bodyDataLayer;
  }
  public SelectionLayer getSelectionLayer() {
    return selectionLayer;
  }
  public IRowDataProvider<TableLine> getBodyDataProvider() {
    return bodyDataProvider;
  }

从表中获取值:

  public BodyLayerStack(List<TableLine> values, IColumnAccessor<TableLine> columnAccessor, Integer[] columnIndicesForRowHeaders) {
      EventList<TableLine> eventList = GlazedLists.eventList(values);
      TransformedList<TableLine, TableLine> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);

创建过滤器和排序列表:

      this.filterList = new FilterList<>(rowObjectsGlazedList);
      this.sortedList = new SortedList<>(filterList, null);
      this.bodyDataProvider = new ListDataProvider<TableLine>(this.sortedList, columnAccessor);
      bodyDataLayer = new DataLayer(this.bodyDataProvider);
      ColumnOverrideLabelAccumulator bodyLabelAccumulator = new ColumnOverrideLabelAccumulator(bodyDataLayer);
      bodyDataLayer.setConfigLabelAccumulator(bodyLabelAccumulator);

      if( columnIndicesForRowHeaders != null ) {
        for ( int i = 0; i < columnIndicesForRowHeaders.length; i++ ) {
          bodyLabelAccumulator.registerColumnOverrides(
            columnIndicesForRowHeaders[i],
            RowHeaderLabel);
        }
      }

事件层:

      GlazedListsEventLayer<TableLine> glazedListsEventLayer =
            new GlazedListsEventLayer<>(bodyDataLayer, this.filterList);

      this.selectionLayer = new SelectionLayer(glazedListsEventLayer, false);
      selectionLayer.setSelectionModel(new RowSelectionModel<TableLine>(selectionLayer, this.bodyDataProvider, new IRowIdAccessor<TableLine>()
      {
        @Override
        public Serializable getRowId(TableLine line)
        {
          return line.getId();
        }
      }));

向选择层添加配置

      selectionLayer.addConfiguration(new DefaultSelectionLayerConfiguration()
      {
        @Override
        protected void addSelectionUIBindings()
        {
          addConfiguration(new SelectionBindings());
        }

        @SuppressWarnings("rawtypes")
        @Override
        protected void addMoveSelectionConfig()
        {
          addConfiguration(new RowOnlySelectionConfiguration());
        }
      });

视口层+返回

      ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);
      setUnderlyingLayer(viewportLayer);
  }

  public FilterList<TableLine> getFilterList() {
      return this.filterList;
  }  
}

标签: nattableglazedlists

解决方案


如果要通过单击列标题单元格来添加排序,则必须将其添加SortHeaderLayer到列标题层堆栈。

请检查NatTable 示例,例如SortableFilterableColumnGroupExample


推荐阅读