Как скрыть/удалить столбец в таблице SWT

Какой подход использовать, чтобы иметь возможность скрывать/удалять столбцы в таблице в SWT (в частности, в плагине Eclipse)?

  • A не может передать эту функциональность в строки, так как мне нужно вставить и скрыть (или удалить) как строки, так и столбцы.
  • Я попытался удалить их с помощью TableColumn.dispose(), но в соответствии с ColumnWeightData в макете не было удалено и сброс всего табличного макета с помощью нового TableLayout не удалял информацию о столбцах из макета.
  • Я попытался создать все необходимые столбцы и спрятать с setWidth (0) те, которые должны быть скрыты/удалены. Образец кода, который я написал, здесь. Этот подход не очень хорош: 3.1. Он не масштабируется. В моем случае максимальное количество столбцов может составлять несколько тысяч, и только немногие действительно нужны пользователю. 3.2. Работа с изменением размера - это действительно ад. AFAIU, даже если столбец setResizable (false) может быть изменен, если размер родительского компонента будет изменен. Чтобы справиться с этим, мне нужно написать огромные слушатели для родительского компонента. Я еще не пытался.

Так что я должен

  • Дальнейшее исследование расположения столбцов таблицы и их использование?
  • Настроить с помощью setWidth (0) на некоторое время, поскольку я еще не встречал проблемы масштабирования?
  • Посмотрите в сторону некоторых сторонних компонентов таблицы (Nattable...)? - Если да, желательно с открытым исходным кодом, поскольку мой Eclipse-плагин является открытым исходным кодом.

Ответы

Ответ 1

Мы делаем это на многих наших таблицах здесь.

Сначала мы убеждаемся, что пользователь не видит, что мы делаем.

table.setRedraw( false );

Затем удалим все столбцы.

while ( table.getColumnCount() > 0 ) {
    table.getColumns()[ 0 ].dispose();
}

И затем добавим нужные.

ArrayList<Column> columns = getShownColumns();

for ( Column column : columns ) {
    TableColumn tableColumn = new TableColumn( table, column.getStyle() );
    tableColumn.setText( column.getTitle() );
    tableColumn.setWidth( column.getWidth() );
}

И, наконец, мы разрешаем пользователю видеть, что мы сделали.

table.setRedraw( true );

Ответ 2

Я бы каждый раз создавал столбцы таблицы только с видимыми столбцами. Если вы используете бит стиля SWT.VIRTUAL, это будет достаточно быстро. Установите table.setRedraw(false), удалите данные из своей таблицы, уничтожьте все столбцы таблицы, заново создайте необходимые и снова настройте свои данные. Затем установите table.setRedraw(true). Это минимизирует мерцание.

Я сделал все это, это сработало хорошо, распоряжение TableColumns работало, как ожидалось.

Использование SWT.VIRTUAL не для слабонервных. Это подразумевает различную обработку вашей таблицы. Вы можете попробовать без этого, чтобы убедиться, что это достаточно быстро.

Наличие таблицы с тысячами столбцов и только отображение нескольких для пользователя звучит очень странно для меня. С нативными реализациями Table я ожидаю проблемы с этим.