Сортировка в 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;
  }  
}

person Michal Kotus    schedule 25.01.2021    source источник


Ответы (1)


Если вы хотите добавить сортировку, щелкнув ячейки заголовка столбца, вам нужно добавить SortHeaderLayer в стек слоев заголовка столбца.

Ознакомьтесь с примерами NatTable, такими как, например, SortableFilterableColumnGroupExample

person Dirk Fauth    schedule 25.01.2021
comment
Спасибо за ваш ответ. В этом примере это SortHeaderLayer<ExtendedPersonWithAddress> sortHeaderLayer = new SortHeaderLayer<> и с тем же параметром создается новый BodyLayerStack. Но какой параметр использовать, если я его создаю без параметров?: BodyLayerStack bodyLayerStack = new BodyLayerStack( tLines, new LineDataProviderColumnAccessor(propertyNames[0].length), params.getColumnIndicesForRowHeaders()); - person Michal Kotus; 25.01.2021
comment
BodyLayerStack должен знать базовый список данных. SortHeaderLayer нуждается в ссылке на SortedList из BodyLayerStack, чтобы выполнить операцию сортировки. Я надеюсь, что это отвечает на вопрос, так как я не уверен, что вы действительно спросили. - person Dirk Fauth; 25.01.2021
comment
Думаю, я реализовал SortHeaderLayer хорошо. Так что же инициализирует фактическую сортировку после нажатия на любой заголовок? @Дирк Фаут - person Michal Kotus; 25.01.2021
comment
Сортировка привязок. По умолчанию только с дополнительным модификатором клика (ALT или STRG), в противном случае используйте SingleClickSortConfiguration. - person Dirk Fauth; 25.01.2021