如何基于组合选择动态创建SWT文本

时间:2013-06-18 17:30:59

标签: java eclipse eclipse-plugin swt jface

我的对话框中有一个Combo和一个文本小部件。初始加载对话框时,我只想要组合,但根据组合选择,我希望显示文本。

以下是代码:

public class NewDialog extends Dialog 
{
private Label label1;
private Combo combo;

private Label label2;
private Text text;

private Composite container;

public NewDialog(Shell parentShell) {
    super(parentShell);
}

@Override
protected Control createDialogArea(Composite parent) 
{
    container = (Composite) super.createDialogArea(parent);
    GridLayout gridLayout = (GridLayout) container.getLayout();
    gridLayout.numColumns = 3;
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);

    label1 = new Label(container, SWT.NONE);
    label1.setText("Class");

    combo = new Combo(container, SWT.NONE);
    GridData gd_combo = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
    gd_combo.widthHint = 165;
    combo.setLayoutData(gd_combo);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);

    combo.add("One");
    combo.add("Two");
    combo.add("Three");


    combo.addSelectionListener(new SelectionAdapter()
    {
        public void widgetSelected(SelectionEvent event)
        {
            if(combo.getText().equals("One"))
            {
                label2 = new Label(container, SWT.NONE);
                label2.setText("Name");


                text = new Text(container, SWT.BORDER);
                GridData gd_text = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
                gd_text.widthHint = 239;
                text.setLayoutData(gd_text);
            }

        }
    });

    return container;
}

我没有根据组合选择在对话框中显示文本。

请告诉我哪里出错了

2 个答案:

答案 0 :(得分:2)

此代码可以完成这项工作:

public static void main(String[] args)
{
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(2, false));

    final Combo combo = new Combo(shell, SWT.SINGLE);
    combo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));

    combo.add("First");
    combo.add("Second");
    combo.add("Third");

    Label label = new Label(shell, SWT.NONE);
    label.setText("Label: ");
    final GridData labelData = new GridData(SWT.BEGINNING, SWT.CENTER, false, true);
    labelData.exclude = true;
    label.setLayoutData(labelData);

    Text text = new Text(shell, SWT.BORDER);
    final GridData textData = new GridData(SWT.FILL, SWT.FILL, true, true);
    textData.exclude = true;
    text.setLayoutData(textData);

    combo.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            boolean change = !combo.getText().equals("First");
            labelData.exclude = change;
            textData.exclude = change;
            shell.pack();
        }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

它基本上使用GridData.exclude字段隐藏/显示LabelText

答案 1 :(得分:0)

如果您确实需要动态创建新控件,那么之后应该在父级上调用layout()。但是,在这种情况下,使控件可见/不可见(如在@ Baz的答案中)更好。