当前位置: 首页 > 面试题库 >

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

方昊
2023-03-14
问题内容

我试图在单击按钮时将诸如文本框,按钮之类的小部件添加到组合中。我已经尝试过了,但是我只能动态地添加这些小部件,最多不超过组合的大小。我的jface对话框是这样的,它具有滚动的复合文件,其中包含复合文件。在主要组合中,我还必须实现此功能的其他3个组合,因此,如果我向组合添加动态小部件,则它可能会扩展,但不应将现有组合叠加到该组合上,而应相应地调整其他组合,并且我应该能够在单击按钮时处理这些小部件。有没有人尝试过这种动态添加和删除小部件的方法,我是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每次添加/删除窗口小部件的最小大小。您将从中使用setMinSize(Point)API
ScrolledComposite。另外,请记住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();
    }
}


 类似资料:
  • 问题内容: 我对此有疑问。我有一个JPanel,通常我会像这样创建一个JLabel: 但是我希望每次单击一个按钮时,在该面板中创建一个新的JLabel,它的大小相同,但高度不同。我试过了: 但是这样一来,我就无法设定界限。我从JTextField获得的stringName。 问题答案: 首先,使用layout。正确完成布局后,组件将按照需要放置。其次,在向布局动态添加组件时,您需要告诉布局更新。这

  • 问题内容: 在NetBeans中,我已经使用GUI编辑器制作了一个JFrame,并且在框架中放置了一个JPanel。目前,我正在尝试在类构造时在面板中创建一个新按钮。这是我的代码,但似乎无法正常工作。(第一行显示该按钮,其他行尝试显示该按钮。) 我整夜都在搜寻Google,但似乎无法正常运作。 问题答案: 有时候,您看不到按钮是布局管理器问题(因为您没有为布局管理器设置正确的属性)。您可以通过禁用

  • 问题内容: 我有一个基于项目数组创建的。当网格滚动到底部时,我需要添加更多图像,但是我不确定该怎么做。 现在我了解以下内容: 我有一个适配器,可以解析该数组并向该类提供ImageIds,该类将返回 我必须以某种方式更改此数组并让适配器知道它,所以我的问题是,如何获得对该适配器的引用? 这是我的代码: 现在有一些冗余代码,但这是我的测试项目。我所知道的是,适配器的更新必须在何时(即何时到达底部)进行

  • 是否有办法将AWT侦听器添加到SWT组件? 我以前制作了一个主要在AWT和Swing组件中运行的应用程序。现在,我有热键功能,它依赖于一个定制的库,该库监听全局键事件并返回相应的AWT键代码。 当我改变整个应用程序并使用SWT组件时,我的问题就出现了。正如我们所知,一些键现在返回一个不同的键代码,这扰乱了整个热键功能。 我想到的最初解决方案是: A.使用javax。摆动jtextfield作为my

  • 问题内容: 我要执行的操作与向电子邮件添加附件的原理类似,您可以单击一个按钮,然后会打开一个新的浏览框,增加您可以拥有的单独附件的数量。 我还很新,所以如果有人可以给我指出一个例子? 问题答案: 动态添加按钮的示例代码。 完整代码:

  • 问题内容: 我想尽可能使用Java代码将jar文件动态添加到我的项目的类路径中,我想使用外部jar文件并加载其类,以便稍后将其作为Beans执行(Spring框架)。 谢谢 :) 问题答案: URLClassLoader child = new URLClassLoader (myJar.toURL(), this.getClass().getClassLoader()); Class class