我正在使用jface tableViewer。当表中没有数据时,它会正确显示所有列但是当Data添加到表时,它会在表的末尾显示额外的空格或列。
我正在使用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 ;-)。当最后一列中的数据发生更改(引入/删除垂直滚动条)时,也可以调用此方法。
到最后一列,我们需要将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;
谢谢托马斯。虽然我使用的是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();
}
}`
只是猜测:也许你的列不会调整大小以填满所有表格?如何设置列的宽度?考虑将TableColumnLayout用于表容器。
在Windows上,如果已设置的所有列的净宽度小于表的维度,则总是会获得额外的列/行。所以让你的列适合你的表总是好的,滚动条还有一些空间,虽然我不是很确定这一点,但总是更好地指定你是想要垂直或水平滚动条。
我使用了packAndFillLastColumn()
方法,它对我有用。但我发现了一个问题。我的桌子是用边框创建的。使用packAndFillLastColumn()
方法后,该行的边框不再存在。我在setLinesVisible(true)
方法中使用了packAndFillLastColumn()
方法,但仍然不起作用。
很简单!只需在createContents函数中的表命令中删除此行:
table.getColumn(ⅰ).pack();
祝好运
无需复杂的黑客就可以在最后删除额外不需要的列空间......
只需创建一个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);
}
作为解决方法使用:
- 对于专栏
使用TableColumnLayout作为treeViewer的复合,并使用以下命令为每列设置适当的列数据:“tableColumnLayout.setColumnData(column,new ColumnWeightData(...根据您的要求));”
- 对于行
将GridData设置为treeViewer的复合并使用“gridData.heightHint = table.getItemHeight()* numberOfVisibleRows”提供高度提示
我发现eclipse已将它标记为WONTFIX ..因此删除此空间无法做太多工作..我们有tp住它... :)