JFace ColumnWeigthData导致父级增长

我有一个Eclipse RCP应用程序,并希望使用ColumnWeigthData作为ColumnLayoutDataTableViewer使用动态列大小。 问题是,无论何时布局表格,父表单(示例代码中的ScrolledForm )都会增长几个像素。

要重现,您可以运行该示例并打开/关闭该部分几次。 每一个关闭部分都会变宽。

为什么会这样做,如何让它停止?

 package com.test; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; public class TestShell extends Shell { private final FormToolkit formToolkit = new FormToolkit(Display.getDefault()); private final Table table; public static void main(final String args[]) { try { final Display display = Display.getDefault(); final TestShell shell = new TestShell(display); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } catch (final Exception e) { e.printStackTrace(); } } public TestShell(final Display display) { super(display, SWT.SHELL_TRIM); setLayout(new FillLayout(SWT.HORIZONTAL)); final ScrolledForm scrldfrmNewScrolledform = formToolkit.createScrolledForm(this); formToolkit.paintBordersFor(scrldfrmNewScrolledform); scrldfrmNewScrolledform.setText("New ScrolledForm"); scrldfrmNewScrolledform.getBody().setLayout(new GridLayout(1, false)); final Section sctnSection = formToolkit.createSection(scrldfrmNewScrolledform.getBody(), Section.TWISTIE | Section.TITLE_BAR); sctnSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); formToolkit.paintBordersFor(sctnSection); sctnSection.setText("Section"); sctnSection.setExpanded(true); final Composite composite = new Composite(sctnSection, SWT.NONE); formToolkit.adapt(composite); formToolkit.paintBordersFor(composite); sctnSection.setClient(composite); final TableColumnLayout tcl_composite = new TableColumnLayout(); composite.setLayout(tcl_composite); final TableViewer tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION); table = tableViewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); formToolkit.paintBordersFor(table); final TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); final TableColumn tblclmnColumn = tableViewerColumn.getColumn(); tcl_composite.setColumnData(tblclmnColumn, new ColumnWeightData(150, 100)); tblclmnColumn.setText("Column"); createContents(); } protected void createContents() { setText("SWT Application"); setSize(450, 300); } @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } } 

感谢帮助。

这是一个关于ColumnWeightData布局的ColumnWeightData ,其解决方法如下所示: bugs.eclipse.org/bugs/show_bug.cgi?id=215997#c4

诀窍是将weigthHint=1设置为包含TableViewerCompositeGridData

如果使用上下布局(父级大小已明确定义),则可以覆盖TableColumnLayout以始终遵循父级的大小:

 /** Forces table never to take more space than parent has*/ public class TableColumnLayout extends org.eclipse.jface.layout.TableColumnLayout { @Override protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { return new Point(wHint, hHint); } }