Таблица показывает дополнительные пустые столбцы в конце - PullRequest
3 голосов
/ 18 октября 2011

Я использую jface tableViewer. Когда в таблице нет данных, она правильно отображает все столбцы, но когда данные добавляются в таблицу, в конце таблицы появляется дополнительное пустое пространство или столбец.

Ответы [ 10 ]

4 голосов
/ 19 апреля 2012

Я использую TreeViewer + TreeViewerColumn, и у меня тоже была эта проблема, этот обходной путь может работать и для вашего TableViewer: программно установить размер последнего столбца при изменении размера родительского элемента:

    treeViewer.getTree().addControlListener(new ControlAdapter() {
        public void controlResized(ControlEvent e) {
            packAndFillLastColumn();
        }
    });

где действие в

// Resize last column in tree viewer so that it fills the client area completely if extra space.
protected void packAndFillLastColumn() {
    Tree tree = treeViewer.getTree();
    int columnsWidth = 0;
    for (int i = 0; i < tree.getColumnCount() - 1; i++) {
        columnsWidth += tree.getColumn(i).getWidth();
    }
    TreeColumn lastColumn = tree.getColumn(tree.getColumnCount() - 1);
    lastColumn.pack();

    Rectangle area = tree.getClientArea();

    Point preferredSize = tree.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    int width = area.width - 2*tree.getBorderWidth();

    if (preferredSize.y > area.height + tree.getHeaderHeight()) {
        // Subtract the scrollbar width from the total column width
        // if a vertical scrollbar will be required
        Point vBarSize = tree.getVerticalBar().getSize();
        width -= vBarSize.x;
    }

    // last column is packed, so that is the minimum. If more space is available, add it.
    if(lastColumn.getWidth() < width - columnsWidth) {
        lastColumn.setWidth(width - columnsWidth);
    }
}

Хорошо работает для меня - вы можете установить для столбца изменяемый размер на false ;-). Это также может вызываться при изменении данных в последнем столбце (введение / удаление вертикальной полосы прокрутки).

1 голос
/ 25 мая 2013

Спасибо, Томас. Ваша идея сработала и для меня, хотя я использовал TableViewer и TableColumn.

Цитирую мой код, чтобы другие могли получить некоторые подсказки.

`public void controlResized(ControlEvent e) {

    if ( listOfTableColumns.size() != colProportions.length )
    {
        logger.warn( "Number of columns passed and size of column proportions array are different. " +
                "Columns resizing shall not be effective on GUI window resizing" );
        return;
    }
    Rectangle area = tableBaseComposite.getClientArea();
    Point size = theTable.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    ScrollBar vBar = theTable.getVerticalBar();
    int width = area.width - theTable.computeTrim(0,0,0,0).width - vBar.getSize().x;
    if (size.y > area.height + theTable.getHeaderHeight()) {
        // Subtract the scrollbar width from the total column width
        // if a vertical scrollbar will be required
        Point vBarSize = vBar.getSize();
        width -= vBarSize.x;
    }
    Point oldSize = theTable.getSize();

    if (oldSize.x > area.width) {
        // table is getting smaller so make the columns 
        // smaller first and then resize the table to
        // match the client area width
        int index = 0 ;
        for ( Iterator<TableColumn> iterator = listOfTableColumns.iterator(); iterator.hasNext(); )
        {
            TableColumn column = iterator.next();
            column.setWidth( (int) numberFromPercentage( width, colProportions[index++] ) );
        }
        listOfTableColumns.get( listOfTableColumns.size() - 1).pack();
        theTable.setSize(area.width, area.height);
    } else {
        // table is getting bigger so make the table 
        // bigger first and then make the columns wider
        // to match the client area width
        int index = 0;
        theTable.setSize(area.width, area.height);
        for ( Iterator<TableColumn> iterator = listOfTableColumns.iterator(); iterator.hasNext(); )
        {
            TableColumn column = iterator.next();
            column.setWidth( (int) numberFromPercentage( width, colProportions[index++] ) );
        }
        listOfTableColumns.get( listOfTableColumns.size() - 1).pack();
    }
}`
0 голосов
/ 18 февраля 2019

Для конечного столбца нам нужно установить для setWidth размер окна или размер оболочки, размер родительской оболочки, например 1500,5000

final TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(title);
column.setResizable(true);
column.setMoveable(true);
//set the setWidth size upto shell size or set upto to some size like 1000,1500,2000,5000
col.setWidth(comp.getShell().getSize().x); // or col.setWidth(1500) ;
return viewerColumn;
0 голосов
/ 20 февраля 2016

В качестве обходного пути используйте:

-Для столбца

используйте TableColumnLayout для составного объекта treeViewer и установите соответствующие данные столбца для каждого столбца, используя: "tableColumnLayout.setColumnData (column, new ColumnWeightData (...в соответствии с вашим требованием)); "

-Для строки

Установите GridData для составного объекта TreeViewer и предоставьте подсказку по высоте, используя gridData.heightHint = table.getItemHeight () * numberOfVisibleRows"

0 голосов
/ 19 марта 2015

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

Просто создайте columnLayout:

TableColumnLayout columnLayout = new TableColumnLayout();

и затем установите его для каждого из ваших столбцов:

columnLayout.setColumnData(YOUR_VIEWER_COLUMN1.getColumn(), new ColumnPixelData(200));
columnLayout.setColumnData(YOUR_VIEWER_COLUMN2.getColumn(), new ColumnWeightData(200, 100));

Наконец, установите макет на родительском композите:

parent.setLayout(columnLayout);

Полный образец:

public void createPartControl(Composite parent) {
    TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);

    TableViewerColumn keyColumn = new TableViewerColumn(viewer, SWT.LEFT);
    TableViewerColumn valueColumn = new TableViewerColumn(viewer, SWT.LEFT);

    TableColumnLayout columnLayout = new TableColumnLayout();
    columnLayout.setColumnData(keyColumn.getColumn(), new ColumnPixelData(200));
    columnLayout.setColumnData(valueColumn.getColumn(), new ColumnWeightData(200, 100));
    parent.setLayout(columnLayout);
}
0 голосов
/ 03 ноября 2013

Так просто! Просто удалите эту строку из команд таблицы в функции createContents:

table.getColumn (я) .pack ();

Good-Luck

0 голосов
/ 23 апреля 2013

Я использовал метод packAndFillLastColumn(), и он работал для меня. Но я нашел одну проблему с этим. Моя таблица была создана с рамкой. После использования метода packAndFillLastColumn() граница для строки больше не существует. Я использовал метод setLinesVisible(true) в методе packAndFillLastColumn(), но он все равно не работает.

0 голосов
/ 03 февраля 2012

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

0 голосов
/ 20 октября 2011

Я обнаружил, что Eclipse пометил его как WONTFIX ... так что не могу сделать много, чтобы удалить это пространство ... У нас есть tp с ним жить ...:)

0 голосов
/ 18 октября 2011

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

...