Java 如何将 swt 小部件动态添加到复合材料中?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20204367/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to dynamically add swt widgets to a composite?
提问by Juseeth
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.
我正在尝试通过单击按钮将文本框、按钮等小部件添加到复合材料中。我试过了,但我只能动态添加这些小部件,最多只能达到复合材料的大小。我的 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();
}
}
采纳答案by GGrec
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.
您的问题的解决方案是设置ScrolledComposite
每次添加/删除小部件时的最小尺寸。您将使用setMinSize(Point)
来自ScrolledComposite
. 另外,请记住layout()
滚动的复合材料,而不是它的子组件。孩子的出生将自动完成。
The addbutton 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();
}
}