表格末尾显示了额外的空白列

时间:2011-10-18 07:21:43

标签: swt eclipse-rcp jface

我正在使用jface tableViewer。当表中没有数据时,它会正确显示所有列但是当Data添加到表中时,它会在表的末尾显示额外的空格或列。

10 个答案:

答案 0 :(得分:4)

我正在使用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 :(得分:1)

谢谢托马斯。你的想法也适合我,虽然我使用的是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();
    }
}`

答案 2 :(得分:0)

猜猜:也许你的专栏没有调整大小以填满所有表格? 如何设置列的宽度? 考虑将TableColumnLayout用于表容器。

答案 3 :(得分:0)

在Windows上,如果已设置的所有列的净宽度小于表的维度,则始终会获得额外的列/行。所以最好让你的列适合你的表,滚动条还有一些空间,虽然我对此不太确定,但总是更好地指定你是想要垂直或水平滚动条。

答案 4 :(得分:0)

我使用packAndFillLastColumn()方法,它对我有用。但我发现了一个问题。我的桌子是用边框创建的。使用packAndFillLastColumn()方法后,该行的边框不再存在。我在setLinesVisible(true)方法中使用了packAndFillLastColumn()方法,但仍然无效。

答案 5 :(得分:0)

这么简单!只需在createContents函数中的表命令中删除此行:

table.getColumn(ⅰ).pack();

好运

答案 6 :(得分:0)

无需复杂的黑客就可以在最后删除额外不需要的列空间......

只需创建一个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);
}

答案 7 :(得分:0)

作为解决方法使用:

-For Column

使用TableColumnLayout作为treeViewer的复合,并使用以下方法为每列设置适当的列数据: “tableColumnLayout.setColumnData(column,new ColumnWeightData(...根据您的要求));”

-For Row

将GridData设置为treeViewer的复合并使用提供高度提示 “gridData.heightHint = table.getItemHeight()* numberOfVisibleRows”

答案 8 :(得分:-1)

我发现eclipse已经将它标记为WONTFIX ..因此删除此空间无法做太多工作。我们已经开始使用了它... :)

答案 9 :(得分:-1)

对于最后一列,我们需要将setWidth设置为窗口大小或shell大小,例如1500,5000的父shell大小

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;