问题
I got an Eclipse RCP app and want to use dynamic column size in a TableViewer
using ColumnWeigthData
as ColumnLayoutData
. Problem is that the parent form (ScrolledForm
in example code) grows a few pixels whenever I layout the table.
To reproduce you can run the example and open/close the Section a few times. On every close the section gets wider.
Why does it do this and how can I make it stop?
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
}
}
Thanks for help.
回答1:
It's a bug concerning layout of ColumnWeightData
with a workaround shown here: bugs.eclipse.org/bugs/show_bug.cgi?id=215997#c4
The trick is to set weigthHint=1
to the GridData
of the Composite
that holds the TableViewer
.
回答2:
If you use top-bottom layout (parent sizes are well-defined), then you can override TableColumnLayout to always respect parent's size:
/** 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);
}
}
来源:https://stackoverflow.com/questions/15971480/jface-columnweigthdata-causes-parent-to-grow