忽略希望增长的控件的布局?

时间:2014-02-03 13:09:42

标签: java swt layout-manager

我在Eclipse插件中创建向导。其中一个包含TableView的向导页面非常高。这使得整个向导窗口也很高,根据TableView的大小。

目前我正在使用FillLayout,就像这样

    @Override
    public void createControl(Composite superParent) {

        //superParent.setLayout(new FillLayout());


        // creating "main" control
        Composite control = new Composite(superParent, SWT.NONE) {
            @Override
            public String toString() {
                return super.toString() + ": control of CoreSettingsPage";
            }
        };
        control.setLayout(new FillLayout());
        //control.setLayoutData(null);


        // creating viewer
        viewer = new TreeViewer(control, SWT.BORDER);
        viewer.setContentProvider(new TreeNodeContentProvider());

那么,如何使该向导窗口忽略TreeView的大小,使滚动条出现?或者可能是SWT中有一些布局,它忽略了包含控件的大小?与JScrollPane中的Swing一样?

更新1

下面是整个向导代码,其中包含一些尝试过的选项

package try_eclipsewizardlayout_01;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;

public class TryWizard extends Wizard {

    abstract class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
    }

    public class Page1 extends WizardPage {

        protected Page1() {
            super("Page 1");
        }

        @Override
        public void createControl(Composite parent) {

            Composite control = new Composite(parent, SWT.NONE) {
                @Override
                public String toString() {
                    return super.toString() + ": control of Page1";
                }
            };
            control.setLayout(new RowLayout(SWT.VERTICAL));

            Group group = new Group(control, SWT.NONE);
            group.setLayout(new GridLayout(1, false));
            group.setText("Options");

            Button option1 = new Button(group, SWT.RADIO);
            option1.setText("Option 1");

            Button option2 = new Button(group, SWT.RADIO);
            option2.setText("Option 2");

            Button option3 = new Button(group, SWT.RADIO);
            option3.setText("Option 3");

            setControl(control);


        }

    }

    public class Page2 extends WizardPage {

        TableViewer viewer;

        private void createViewer(Composite child) {

            viewer = new TableViewer(child, SWT.BORDER);

            viewer.setContentProvider(new IStructuredContentProvider() {

                @Override
                public void dispose() {
                }

                @Override
                public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                }

                @Override
                public Object[] getElements(Object inputElement) {
                    Object[] ans = new Object[100];
                    for(int i=0; i<ans.length; ++i) {
                        ans[i] = new String[] {"name " + i, "value " + i};
                    }
                    return ans;
                }

            });

            viewer.setLabelProvider(
                    new TableLabelProvider() {

                        @Override
                        public String getColumnText(Object element, int columnIndex) {
                            return ((String[])element)[columnIndex];
                        }

                        @Override
                        public Image getColumnImage(Object element, int columnIndex) {
                            return null;
                        }
                    }
            );

            // dummy data which is ignored
            viewer.setInput(new Object());
        }

        protected Page2() {
            super("Page 2");
        }

        /* 
         * this version shows normal sized wizrd (not tall)
         * but no table on Page 2
         */
        @Override
        public void createControl(Composite parent) {

            ScrolledComposite control = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL) {
                @Override
                public String toString() {
                    return super.toString() + ": control of Page2";
                }
            };

            // Create a child composite to hold the controls
            Composite child = new Composite(control, SWT.NONE);
            child.setLayout(new FillLayout());

            createViewer(child);

            control.setContent(child);
            control.setMinSize(100, 100);

            setControl(control);
        }

        /*
        @Override
        public void createControl(Composite parent) {

            Composite control = new Composite(parent, SWT.BORDER) {
                @Override
                public String toString() {
                    return super.toString() + ": control of Page2";
                }
            };


            createViewer(control);


            // control.setLayout(new FillLayout()); // tall wizard, table fills it, vertical scroll present

            control.setLayout(new GridLayout(1, false));
            viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // tall wizard, table fills it, vertical scroll present
            //viewer.getTable().setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true)); // tall wizard, thin table, vertical scroll present
            //viewer.getTable().setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false)); // tall wizard,  thin table, no vertical scroll
            //viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); // tall wizard,  thin table, no vertical scroll          


            setControl(control);

        }
        */

    }

    Page1 page1 = new Page1();
    Page2 page2 = new Page2();

    @Override
    public void addPages() {
        addPage(page1);
        addPage(page2);
    }

    @Override
    public boolean performFinish() {
        return false;
    }

}

整个简单的日食项目SSCCE在这里:https://drive.google.com/file/d/0By8pZ9a2478Yb2l4TUp6WTh1UGs/edit?usp=sharing

2 个答案:

答案 0 :(得分:2)

您可以使用org.eclipse.swt.layout.GridLayout(1, false)作为树的布局:

GridData gd= new GridData(GridData.FILL, GridData.BEGINNING, true, true);
gd.heightHint= 200;
viewer.getTree().setLayout(new GridLayout());
viewer.getTree().setLayoutData(gd);

如果您不确定superParent的布局是什么,那么为了安全起见,请为您的观众创建一个复合材料,如下所示:

Composite c = new Composite(shell, SWT.NONE);
c.setLayout(new GridLayout());
c.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
viewer = new TreeViewer(c, SWT.BORDER);

答案 1 :(得分:1)

您可以做两件事:

  1. TableViewer换成ScrolledCompositehere就是一个例子)。
  2. 使用GridLayoutGridData并将垂直/水平对齐设置为除SWT.FILL之外的其他内容,即SWT.BEGINNINGSWT.TOP,以便不进行它使用过多的空间,然后限制父级的大小。