Reputation: 129
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
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
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