如何动态添加swt小部件到复合?

我正在尝试添加文本框,按钮等小部件,点击按钮。 我试过了,但我只能动态添加这些小部件,最多只能达到复合的大小。 我的jface对话框是这样的,它有一个滚动的复合,其中包含一个复合。 在主要复合材料中我有3个其他复合材料,我必须实现这个function,所以如果我将动态窗口小部件添加到复合材料中它可能会扩展,但它不应该重叠现有复合材料,而应该相应地调整其他复合材料。我应该能够按下按钮处理这些小部件。 有没有人试过这个动态添加和删除小部件之前,我是swt,jface的新手。 那么,任何人都可以在这里分享他们的经验,我发布了我尝试过的代码。

import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; public class DynamicDialog extends Dialog { private Text text; private Text text_1; private Composite composite; /** * Create the dialog. * @param parentShell */ public DynamicDialog(Shell parentShell) { super(parentShell); } /** * Create contents of the dialog. * @param parent */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); container.setLayout(new FillLayout(SWT.HORIZONTAL)); ScrolledComposite scrolledComposite = new ScrolledComposite(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); composite = new Composite(scrolledComposite, SWT.NONE); composite.setLayout(new FormLayout()); scrolledComposite.setContent(composite); scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); final Composite composite_1 = new Composite(composite, SWT.NONE); composite_1.setLayout(new GridLayout(4, false)); final FormData fd_composite_1 = new FormData(); fd_composite_1.top = new FormAttachment(0); fd_composite_1.left = new FormAttachment(0, 10); fd_composite_1.bottom = new FormAttachment(0, 85); fd_composite_1.right = new FormAttachment(0, 430); composite_1.setLayoutData(fd_composite_1); Label label = new Label(composite_1, SWT.NONE); label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); label.setText("1"); text_1 = new Text(composite_1, SWT.BORDER); text_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); text = new Text(composite_1, SWT.BORDER); text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button btnDelete = new Button(composite_1, SWT.NONE); btnDelete.setText("delete"); final Composite composite_2 = new Composite(composite, SWT.NONE); composite_2.setLayout(new GridLayout(2, false)); final FormData fd_composite_2 = new FormData(); fd_composite_2.bottom = new FormAttachment(100, -91); fd_composite_2.top = new FormAttachment(0, 91); fd_composite_2.right = new FormAttachment(100, -10); fd_composite_2.left = new FormAttachment(100, -74); composite_2.setLayoutData(fd_composite_2); new Label(composite_2, SWT.NONE); Button btnAdd = new Button(composite_2, SWT.NONE); btnAdd.setText("ADD"); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Label label2 = new Label(composite_1, SWT.NONE); label2.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); label2.setText("1"); Text text_12 = new Text(composite_1, SWT.BORDER); text_12.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Text text13 = new Text(composite_1, SWT.BORDER); text13.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button btnDelete = new Button(composite_1, SWT.NONE); btnDelete.setText("delete"); //Point p0 = composite_1.getSize(); //composite_1.setSize(SWT.DEFAULT,SWT.DEFAULT); composite_1.layout(); //Point p = composite.getSize(); //composite.setSize(SWT.DEFAULT,SWT.DEFAULT); //composite.setSize(p); // composite.layout(); } }); return container; } /** * Create contents of the button bar. * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(450, 300); } public static void main(String[] args){ Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); DynamicDialog dd = new DynamicDialog(shell); dd.open(); } } 

您的问题的解决方案是每次添加/删除窗口小部件时设置ScrolledComposite的最小大小。 您将使用ScrolledComposite setMinSize(Point) API。 另外,请记住layout()滚动的复合,而不是它的子。 孩子的铺设将自动完成。

添加按钮当前随每个新添加的组件一起移动。 如果您希望它不移动,只需将其移动到滚动的复合内容之外。

另外,我已经清理了一点代码,希望你不要介意。 🙂

 public class DynamicDialog extends Dialog { private int count = 1; public DynamicDialog(final Shell parent) { super(parent); } @Override protected Control createDialogArea(final Composite parent) { final Composite container = (Composite) super.createDialogArea(parent); container.setLayout(new FillLayout()); final ScrolledComposite scrolledComposite = new ScrolledComposite(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); final Composite composite = new Composite(scrolledComposite, SWT.NONE); composite.setLayout(new GridLayout(1, false)); scrolledComposite.setContent(composite); scrolledComposite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); final Composite composite_1 = new Composite(composite, SWT.NONE); composite_1.setLayout(new GridLayout(2, false)); composite_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); final Label lblDefault = new Label(composite_1, SWT.NONE); lblDefault.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblDefault.setText("Default:"); final Combo combo = new Combo(composite_1, SWT.NONE); combo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1)); final Composite composite_2 = new Composite(composite, SWT.NONE); composite_2.setLayout(new GridLayout(4, false)); composite_2.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); final Composite composite_3 = new Composite(composite, SWT.NONE); composite_3.setLayout(new GridLayout()); composite_3.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); final Button btnAdd = new Button(composite_3, SWT.NONE); btnAdd.setText("Add"); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { final Label label2 = new Label(composite_2, SWT.NONE); label2.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); label2.setText( String.valueOf(count++) ); new Text(composite_2, SWT.BORDER).setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); new Text(composite_2, SWT.BORDER).setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); new Button(composite_2, SWT.NONE).setText("Delete"); // DO THIS: scrolledComposite.layout(true, true); scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); // .. and it will work } }); return container; } @Override protected void createButtonsForButtonBar(final Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(450, 300); } public static void main(final String[] args) { final Shell shell = new Shell(new Display()); shell.setLayout(new FillLayout()); new DynamicDialog(shell).open(); } }