kk331317
kk331317

Reputation: 129

How to dynamically create an SWT Text based on a combo selection

I have a Combo and a text widget in my dialog. When the dialog is initially loaded i only want the combo to be present , but based on a combo selection i want the Text to be displayed.

Here is the code :

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

Im not getting the Text displayed in the dialog based on the combo selection.

Please let me know where im going wrong

Upvotes: 0

Views: 3784

Answers (2)

Alexey Romanov
Alexey Romanov

Reputation: 170723

If you actually need to create new controls dynamically, you should call layout() on the parent afterwards. In this case, however, making the controls visible/invisible (as in @Baz's answer) is better.

Upvotes: 0

Baz
Baz

Reputation: 36884

This code will do the job:

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

It basically uses the GridData.exclude field to hide/show the Label and Text.

Upvotes: 2

Related Questions