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

问题描述 投票:3回答:10

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

swt eclipse-rcp jface
10个回答
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
投票

到最后一列,我们需要将setWidth设置为窗口大小或shell-size,父shell大小如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;

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();
    }
}`

0
投票

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


0
投票

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


0
投票

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


0
投票

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

table.getColumn(ⅰ).pack();

祝好运


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);
}

0
投票

作为解决方法使用:

- 对于专栏

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

- 对于行

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


-1
投票

我发现eclipse已将它标记为WONTFIX ..因此删除此空间无法做太多工作..我们有tp住它... :)

© www.soinside.com 2019 - 2024. All rights reserved.