[英]how to dynamically add swt widgets to a composite?
我正在尝试在单击按钮时添加文本框,按钮等小部件。 我试过了,但我只能动态地添加这些小部件,最多只能达到复合的大小。 我的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
的最小大小。 您将使用ScrolledComposite
setMinSize(Point)
API。 另外,请记住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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.