两个Eclipse UI Form部分可以抓住多余的垂直空间并正确折叠?

时间:2010-02-08 12:11:13

标签: java eclipse user-interface swt eclipse-rcp

我正在尝试创建一个Eclipse表单,它有三个可折叠部分,一个固定大小,另外两个应该抓住编辑器窗口中所有剩余的垂直空间,这样,当其中一个底部折叠时,另一个一个人将填补所有可用空间。

我已阅读forms article,尝试了grabExcessVerticalSpaceSWT.FILL的许多变体以及各部分的GridData所提供的所有内容,但没有运气。我也尝试将部分客户端嵌套在grabExcess...Space的复合材料中,但这也无济于事。调用layout()没有帮助,折叠部分时表单会重新流动,折叠第一部分可以正常工作。

这是一个包含三个部分的表单的代码,但是其中两个底部部分在折叠时只放弃了它们的一小部分空间,而不是我想要的所有部分:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

public class SectionFormPage extends FormPage {
    private IManagedForm managedForm;

    public SectionFormPage(FormEditor editor) {
        super(editor, "sectionEditor", "title");
    }

    protected void createFormContent(IManagedForm managedForm) {
        this.managedForm = managedForm;
        FormToolkit toolkit = managedForm.getToolkit();
        Composite body = managedForm.getForm().getBody();

        body.setLayout(new GridLayout());

        createSectionWithButton(toolkit, body, new GridData(SWT.FILL, SWT.FILL, true, false));
        createSectionWithButton(toolkit, body, new GridData(SWT.FILL, SWT.FILL, true, true));
        createSectionWithButton(toolkit, body, new GridData(SWT.FILL, SWT.FILL, true, true));

        body.layout();
    }

    private void createSectionWithButton(FormToolkit toolkit, final Composite body, final GridData layoutData) {
        Section section = createSection(toolkit, body, "Section");
        section.setLayoutData(layoutData);
        section.setClient(toolkit.createButton(section, "button", SWT.NONE));
    }

    private Section createSection(final FormToolkit toolkit, final Composite body, String title) {
        Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
        section.setText(title);
        managedForm.addPart(new SectionPart(section));
        section.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                managedForm.reflow(true);
            }
        });
        return section;
    }
}

任何指针?对于章节或其父母或客户,甚至应该指定哪种布局?先谢谢!

2 个答案:

答案 0 :(得分:8)

我终于有一位同事看了这个,我们一起找到了一个解决方案,诀窍就是当部分是GridData时,只需将grabExcessVerticalSpace修改为而不是 private void createSectionWithButton(FormToolkit toolkit, final Composite body, final GridData layoutData) { final Section section = createSection(toolkit, body, "Section", layoutData.grabExcessVerticalSpace); section.setLayoutData(layoutData); section.setClient(toolkit.createButton(section, "button", SWT.NONE)); } private Section createSection(final FormToolkit toolkit, final Composite body, String title, boolean shouldGiveUpVerticalSpaceWhenFolded) { final Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED); section.setText(title); managedForm.addPart(new SectionPart(section)); if (shouldGiveUpVerticalSpaceWhenFolded) { section.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { GridData gridData = (GridData) section.getLayoutData(); gridData.grabExcessVerticalSpace = e.getState(); } }); } section.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { managedForm.reflow(true); } }); return section; } 折叠:

{{1}}

我只是坚持我的想法,必须有可能以某种方式用布局来定义它。我仍然有兴趣知道它是不是。

答案 1 :(得分:0)

对于我正在处理的应用程序,我们创建了一个自定义布局类,用于检查它是否是ExpandableComposite,或者我们已经像您一样修改了布局数据。