简体   繁体   English

如何动态地将swt小部件添加到组合中?

[英]how to dynamically add swt widgets to a composite?

I'm trying to add widgets like text boxes, buttons to a composite on click of a button. 我正在尝试在单击按钮时添加文本框,按钮等小部件。 I've tried , but i could only add these widgets dynamically only up to the size of the composite. 我试过了,但我只能动态地添加这些小部件,最多只能达到复合的大小。 My jface dialog is such that, it has a scrolled composite in which it holds a composite. 我的jface对话框是这样的,它有一个滚动的复合,其中包含一个复合。 In the main composite i have 3 other composites where i have to achieve this functionality, so if i add dynamic widgets to a composite it might expand, but it should not overlap existing composites down to it, rather it should adjust other composites accordingly and also i should be able to dispose those widgets on a button click. 在主要复合材料中我有3个其他复合材料,我必须实现这个功能,所以如果我将动态窗口小部件添加到复合材料中它可能会扩展,但它不应该重叠现有复合材料,而应该相应地调整其他复合材料。我应该能够按下按钮处理这些小部件。 Did any one try this dynamic addition and removal of widgets before, I'm new to swt, jface . 有没有人试过这个动态添加和删除小部件之前,我是swt,jface的新手。 So, could any one share their experience here, I'm posting the code i've tried. 所以,任何人都可以在这里分享他们的经验,我发布了我尝试过的代码。

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();

}

}

The solution to your problem is to set the minimum size of the ScrolledComposite each time you add/remove a widget. 您的问题的解决方案是每次添加/删除窗口小部件时设置ScrolledComposite的最小大小。 You will use setMinSize(Point) API from ScrolledComposite . 您将使用ScrolledComposite setMinSize(Point) API。 Also, remember to layout() the scrolled composite, and not its children. 另外,请记住layout()滚动的复合,而不是它的子。 The laying of children will be done automatically. 孩子的铺设将自动完成。

The add button currently moves along with each newly added component. 添加按钮当前随每个新添加的组件一起移动。 If you want it to not move, just move it outside the scrolled composite content. 如果您希望它不移动,只需将其移动到滚动的复合内容之外。

Also, I've cleaned up your code a little bit, I hope you don't mind. 另外,我已经清理了一点代码,希望你不要介意。 :-) :-)

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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM