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. 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. Did any one try this dynamic addition and removal of widgets before, I'm new to 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();
}
}
Composite is an ancestor of every SWT class to which you can add widgets, including Shell . For that reason, you can think of a Composite as being simply the working area of a Shell , without the styles associated with the aspects of Shell that make windows—the titlebar, control menu, etc.
The Standard Widget Toolkit (SWT) is a graphical widget toolkit for use with the Java platform.
The Standard Widget Toolkit (SWT) is a Java based user interface library for developing desktop application. SWT supports Windows, Linux and Mac OS X. It provides lots of standard widgets, e.g., buttons and text fields as well as the option to create custom widgets.
The solution to your problem is to set the minimum size of the ScrolledComposite
each time you add/remove a widget. You will use setMinSize(Point)
API from ScrolledComposite
. Also, remember to layout()
the scrolled composite, and not its children. 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();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With