为什么滚动条在 jface 对话框中不起作用



每当我点击添加按钮时,我都会尝试动态添加按钮、文本框和标签。我想在另外两个复合材料中实现这种行为,但在同一个对话框中。我使用的是滚动组合,所以每当我点击添加按钮时,就会相应地创建一个新的标签、文本框和按钮。

问题是,每当它们到达对话框的末尾时,滚动的组合似乎并没有扩展对话框。最好的方法是什么?

composite_1

1[][]按钮删除

按钮添加

composite_2

1[][]按钮删除

按钮添加


1[][]按钮删除

按钮添加


ok按钮取消按钮

 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 scrolledComposite1 = new ScrolledComposite(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrolledComposite1.setExpandHorizontal(true);
        scrolledComposite1.setExpandVertical(true);

        final Composite composite_1 = new Composite(scrolledComposite1, SWT.NONE);
        composite_1.setLayout(new GridLayout(4, false));
        FormData fd_composite_1 = new FormData();
        fd_composite_1.top = new FormAttachment(0, 10);
        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));
        FormData fd_composite_2 = new FormData();
        fd_composite_2.bottom = new FormAttachment(composite_1, 41, SWT.BOTTOM);
        fd_composite_2.top = new FormAttachment(composite_1, 6);
        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");
        scrolledComposite.setContent(composite);
        scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        scrolledComposite1.setContent(composite_1);
        scrolledComposite1.setMinSize(composite_1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        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(p0.x+10, p0.y+10);
                composite_1.setSize(p0);
                composite_1.layout();
                Point p = composite.getSize();
                composite.setSize(p.x+10, p.y+10);
                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){
    Shell shell =  new Shell(new Display());
    shell.setLayout(new FillLayout());
    DynamicDialog dd = new DynamicDialog(shell);
    dd.open();
}
}

不确定这是否适用于您的案例,但我很难让滚动窗格填满可用空间。它要么只占据内部组件的整个首选大小(没有滚动条,比容器大),要么缩小到最小大小。

为了修复它,我必须设置LayoutData:

GridData scrollPaneData = new GridData(GridData.FILL_BOTH);
scrolledComposite.setLayoutData(scrollPaneData);

最新更新