4

我有一个 Eclipse RCP 应用程序,想在as中TableViewer使用动态列大小。问题是每当我布局表格时,父表单(在示例代码中)都会增长几个像素。ColumnWeigthDataColumnLayoutDataScrolledForm

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

为什么它会这样做,我怎样才能让它停止?

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

感谢帮助。

4

2 回答 2

5

这是一个关于布局的错误,ColumnWeightData这里显示了一个解决方法:bugs.eclipse.org/bugs/show_bug.cgi?id=215997#c4

诀窍是设置weigthHint=1为持有GridData的。CompositeTableViewer

于 2013-04-12T20:58:09.517 回答
0

如果您使用上下布局(父尺寸定义明确),那么您可以覆盖 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);
    }
}
于 2014-09-04T14:45:54.047 回答