Есть ли способ автоматического изменения размера столбцов в процентах, когда группа столбцов свернута / развернута в NatTable - PullRequest
0 голосов
/ 31 января 2019

Я нашел класс ResizeColumnHideShowLayer в nattable версии 1.6.(около https://bugs.eclipse.org/bugs/show_bug.cgi?id=521486)

Это нормально работает только для обычных заголовков столбцов. Но, если я сверну группу столбцов, не нужно настраивать размер, чтобы соответствовать окну. (без увеличения размера столбца)

Какя могу решить проблему? Есть ли способ изменить размеры других столбцов, чтобы подогнать окно автоматически?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Я нашел решение сам!
Отлично работает.: -)
Я работал на основе версии NatTable v1.6. (Скачано вчера)

Я думаю, что это базовая функция, поэтому я надеюсь, что эта функция будет включена вследующая версия NatTable.
В узких таблицах поведение сворачивающейся группы столбцов означает, что кто-то захочет просматривать другие данные столбца более широко.

Обзор (Экран проблем и решенный экран)

Я объясняю, используя два приложения (до, после) снимок экрана.
Обратитесь к нижнему изображению, если хотите быстро понять мою проблему.

Экран проблемы

введите описание изображения здесь


Улучшенный экран

введите описание изображения здесь


Краткое описание решения:

  1. Добавить событиеслушатель ColumnGroupExpandCollapseLayer.
    (HideColumnPositionsEvent, ShowColumnPositionsEvent)
  2. Обрабатывать вышеуказанные события.
    Получить индексы столбцов, которые скрыты свернутыми
    Выполнить MultiColumnHideCommand с индексами

Структура слоя моего тестового кода

↑ ViewportLayer (top layer)
| SelectionLayer
| ColumnGroupExpandCollapseLayer
| ResizeColumnHideShowLayer
| ColumnGroupReorderLayer
| ColumnReorderLayer
| DataLayer (base layer)

Код реализации приведен ниже:

void method() {
    ...
    columnGroupExpandCollapseLayer.addLayerListener(new ILayerListener() {
        @Override
        public void handleLayerEvent(ILayerEvent event) {
            boolean doRedraw = false;

            //It works for HideColumnPositionsEvent and ShowColumnPositionsEvent 
            // triggered by ColumnGroupExpandCollapseCommandHandler
            if (event instanceof HideColumnPositionsEvent) {
                HideColumnPositionsEvent hideEvent = (HideColumnPositionsEvent)event;

                Collection<Range> columnPositionRanges = hideEvent.getColumnPositionRanges();
                Collection<Integer> convertIntegerCollection = convertIntegerCollection(columnPositionRanges);
                int[] positions = convertIntPrimitiveArray(convertIntegerCollection);

                //Execute command to hide columns that was hidden by collapsed column group.
                MultiColumnHideCommand multiColumnHideCommand = new MultiColumnHideCommand(resizeColumnHideShowLayer, positions);
                resizeColumnHideShowLayer.doCommand(multiColumnHideCommand);

                doRedraw = true;

            }else if (event instanceof ShowColumnPositionsEvent) {//called by  ColumnGroupCollapsedCollapseCommandHandler
                ShowColumnPositionsEvent showEvent = (ShowColumnPositionsEvent)event;
                Collection<Range> columnPositionRanges = showEvent.getColumnPositionRanges();
                Collection<Integer> positions  = convertIntegerCollection(columnPositionRanges);

                //Execute command to show columns that was hidden by expanded column group.
                MultiColumnShowCommand multiColumnShowCommand = new MultiColumnShowCommand(positions);
                resizeColumnHideShowLayer.doCommand(multiColumnShowCommand);

                //Set whether or not to redraw table
                doRedraw = true;
            }
            if (doRedraw) {
                natTable.redraw();
            }
        }

        /**
         * Merge position values within several Ranges to Integer collection
         */
        private Collection<Integer> convertIntegerCollection(Collection<Range> rangeCollection) {

            Iterator<Range> rangeIterator = rangeCollection.iterator();
            Set<Integer> mergedPositionSet = new HashSet<Integer>();
            while (rangeIterator.hasNext()) {
                Range range = rangeIterator.next();
                mergedPositionSet.addAll(range.getMembers());
            }
            return mergedPositionSet;
        }
        /**
         * Convert Integer wrapper object to primitive value
         */
        private int [] convertIntPrimitiveArray(Collection<Integer> integerCollection) {
            Integer [] integers = (Integer [])integerCollection.toArray(new Integer[integerCollection.size()]);
            int [] positionPrimitives = new int[integers.length];               
            for (int i = 0 ; i < integers.length ; i++) {
                positionPrimitives[i] = integers[i].intValue();
            }
            return positionPrimitives;
        }
        });
}
0 голосов
/ 31 января 2019

В настоящее время не потому, что ColumnGroupExpandCollapseLayer заботится о сокрытии свернутых столбцов.

...