Я пытаюсь создать форму Eclipse с тремя складными секциями, одним фиксированным размером и двумя другими, которые должны занимать все оставшееся вертикальное пространство в окне редактора, чтобы при складывании одной из нижних секций другая заполняла все доступное пространство.
Я прочитал статью о формах, пробовал много вариантов grabExcessVerticalSpace
и SWT.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 ответа
Наконец, я попросил коллегу взглянуть на это, и вместе мы сразу нашли решение. Хитрость заключалась в том, чтобы просто изменить GridData
на not 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;
}
Я просто застрял в своей идее, что это должно быть возможно как-то определить с помощью макета. Мне все равно было бы интересно узнать, так ли это.
Для приложения, над которым я работаю, мы создали собственный класс макета, который проверяет, является ли он ExpandableComposite или мы изменили данные макета, как вы.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].