Удалить несколько столбцов в NatTable

Я использую NatTable для отображения данных таблицы, таблица может быть отсортирована и отфильтрована. Поскольку таблица довольно большая, я также использовал GlazedList. Мне нужно иметь возможность удалять столбцы после сортировки и фильтрации. Как я и пытался, я мог только удалить содержимое таблицы, но там остался заголовок. Заголовок столбца вложен во многие слои, и я не знаю, могу ли я повлиять на него или вызвать его обновление.

Мой код в основном из примеров с небольшими изменениями:

настроить слои:

ModelProvider mp = new ModelProvider();

    // property names of the Person class

    this.propertyNames = new String[this.attributeNames.size() + 1];
    this.propertyNames[0] = "Entry";
    for (int i = 0; i < this.attributeNames.size(); i++) {
        this.propertyNames[i + 1] = this.attributeNames.get(i);
    }

    // mapping from property to label, needed for column header labels
    this.propertyToLabelMap = new HashMap<String, String>();

    for (String str : this.propertyNames) {
        this.propertyToLabelMap.put(str, str);
    }

    IColumnPropertyAccessor<GazEntry> columnPropertyAccessor = new GazColumnPropertyAccessor();

    final BodyLayerStack<GazEntry> bodyLayerStack = new BodyLayerStack<GazEntry>(
            mp.entrylines, columnPropertyAccessor);

    IDataProvider columnHeaderDataProvider =
            new DefaultColumnHeaderDataProvider(this.propertyNames, this.propertyToLabelMap);
    final DataLayer columnHeaderDataLayer =
            new DataLayer(columnHeaderDataProvider);
    final ColumnHeaderLayer columnHeaderLayer =
            new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayerStack, bodyLayerStack.getSelectionLayer());

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

    // build the column header layer

    // Note: The column header layer is wrapped in a filter row composite.
    // This plugs in the filter row functionality
    FilterRowHeaderComposite<GazEntry> filterRowHeaderLayer = new FilterRowHeaderComposite<GazEntry>(
            new DefaultGlazedListsFilterStrategy<GazEntry>(
                    bodyLayerStack.getFilterList(), columnPropertyAccessor,
                    configRegistry), sortHeaderLayer,
            columnHeaderDataLayer.getDataProvider(), configRegistry);

    // build the row header layer
    IDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(
            bodyLayerStack.getBodyDataProvider());
    DataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(
            rowHeaderDataProvider);
    final ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer,
            bodyLayerStack, bodyLayerStack.getSelectionLayer());

    // build the corner layer
    IDataProvider cornerDataProvider = new DefaultCornerDataProvider(
            columnHeaderDataProvider, rowHeaderDataProvider);
    DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
    ILayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer,
            filterRowHeaderLayer);

    IRowDataProvider<GazEntry> bodyDataProvider = (IRowDataProvider<GazEntry>) bodyLayerStack.getBodyDataProvider();
    bodyLayerStack.setConfigLabelAccumulator(new CrossValidationLabelAccumulator(
            bodyDataProvider));

    // DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);
    bodyLayerStack.registerCommandHandler(new
            DeleteRowCommandHandler<GazEntry>(bodyLayerStack.bodyData));

    //TODO: register delete column.
    bodyLayerStack.registerCommandHandler(new
            DeleteColCommandHandler<GazEntry>(bodyLayerStack.bodyData));

и обработчик команды для удаления столбца

class DeleteColCommandHandler<T> implements ILayerCommandHandler<DeleteColCommand> {

    private List<T> bodyData;

    public DeleteColCommandHandler(List<T> bodyData) {
        this.bodyData = bodyData;
    }

    @Override
    public Class<DeleteColCommand> getCommandClass() {
        return DeleteColCommand.class;
    }

    //TODO: delete column
    @Override
    public boolean doCommand(ILayer targetLayer, DeleteColCommand command) {
        // convert the transported position to the target layer
        if (command.convertToTargetLayer(targetLayer)) {
            // remove the element
            // this.bodyData.remove(command.getRowPosition());
            SelectionLayer slayer = ((BodyLayerStack) targetLayer).getSelectionLayer();
            int[] selected = slayer.getSelectedColumnPositions();

            for (int index : selected) {
                String colName = CopyOf_6031_GlazedListsFilterExample.this.propertyNames[index];
                CopyOf_6031_GlazedListsFilterExample.this.attributeNames.remove(colName);
                targetLayer.fireLayerEvent(new
                        ColumnDeleteEvent(targetLayer, index));
            }
            return true;
        }
        return false;
    }
}

как сказано, это удаляет содержимое столбца, но оставляет заголовок. Может кто-нибудь сказать мне, как я также могу удалить заголовок столбца?

1 ответ

Решение

Вы действительно хотите удалить столбец или просто хотите скрыть столбец? Потому что прятаться было бы намного проще. Конечно, это зависит от вашего варианта использования и от того, можно ли изменить модель данных, чтобы действительно удалить столбец.

Тем не менее DefaultColumnHeaderDataProvider не поддерживает динамическое добавление или удаление столбцов, поскольку оно основано на массиве. Для такого случая использования вам нужно предоставить собственный IDataProvider для заголовка столбца. Приложение NatTable examples содержит пример для этого в Tutorial examples -> Data -> DynamicColumnExample.

Вам просто нужно реализовать IDataProvider, который основан на List, а не на массиве, чтобы можно было удалять элементы и изменять их размер.

Другие вопросы по тегам