代码之家  ›  专栏  ›  技术社区  ›  KlausS

JFace ColumnWeightData导致父级增长

  •  4
  • KlausS  · 技术社区  · 11 年前

    我有一个Eclipse RCP应用程序,希望在 TableViewer 使用 ColumnWeigthData ColumnLayoutData 。问题是父窗体( 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
        }
    }
    

    谢谢你的帮助。

    2 回复  |  直到 11 年前
        1
  •  5
  •   KlausS    11 年前

    这是一个关于布局的错误 ColumnWeightData 此处显示了一个变通方法: bugs.eclipse.org/bugs/show_bug.cgi?id=215997#c4

    诀窍是设置 weigthHint=1 GridData Composite 持有 TableViewer .

        2
  •  0
  •   Basilevs    10 年前

    如果使用自上而下的布局(父级大小定义良好),则可以覆盖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);
        }
    }