如何替换按钮并动态重新定位?

How to replace a button and re position it dynamically?

我旁边有一个文本框和一个添加按钮,当我单击添加按钮时,我可以在它旁边添加一个文本框和删除按钮。现在我想将第一行的添加按钮更改为删除,并且添加按钮应该重新定位在两行下方,当点击第二行删除按钮(第二行被删除)时,添加按钮应该回到第一行并替换删除按钮。它应该如下所示。

我该如何实现?

如果您创建一个 Composite 作为各种容器,您可以在其中添加和删除,从而使外部的所有内容保持正确的顺序。通过保留space,删除按钮始终在容器内容下方。

I have a text box and a add button next to it, when I click on add button I am able to add a text box and delete button next to it

例如,如果我们有一个小的 Shell,如您提到的那样添加了 Button,还有一个空的 space,用于将 Text 小部件添加到:

final Composite baseComposite = new Composite(shell, SWT.BORDER);
baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
baseComposite.setLayout(new GridLayout());

final Composite rowsContainerComposite = new Composite(baseComposite, SWT.BORDER);
rowsContainerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
rowsContainerComposite.setLayout(new GridLayout());

final Button addButton = new Button(baseComposite, SWT.PUSH);
addButton.setText("Add");

(目前空 space 正在获取所有可用的 space,但您可以根据需要进行更改)

添加行时,可以添加到rowsContainerComposite:

addButton.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(final SelectionEvent e) {
        new Row(rowsContainerComposite);
        rowsContainerComposite.layout();
    }
});

样本Row class:

public class Row {

    final Composite baseComposite;

    public Row(final Composite parent) {
        baseComposite = new Composite(parent, SWT.BORDER);
        baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        baseComposite.setLayout(new GridLayout(2, false));

        final Text text = new Text(baseComposite, SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Button deleteButton = new Button(baseComposite, SWT.PUSH);
        deleteButton.setText("Delete");
        deleteButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                baseComposite.dispose();
                parent.layout();
            }

        });
    }

}

when the second row delete button is clicked (the second row is deleted )the add button should go back to the first row

然后删除时,行将适当地移回:

the add button should be re-positioned below two rows

想法是,通过使用 "container" 组合,您可以保留 space 添加和删除行。添加和删​​除行时,删除按钮将始终位于行下方。


完整示例:

public class AddDeleteButtonTest {

    private static class Row {

        final Composite baseComposite;

        public Row(final Composite parent) {
            baseComposite = new Composite(parent, SWT.BORDER);
            baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
            baseComposite.setLayout(new GridLayout(2, false));

            final Text text = new Text(baseComposite, SWT.BORDER);
            text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            final Button deleteButton = new Button(baseComposite, SWT.PUSH);
            deleteButton.setText("Delete");
            deleteButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(final SelectionEvent e) {
                    baseComposite.dispose();
                    parent.layout();
                }

            });
        }

    }

    private final Display display;
    private final Shell shell;

    public AddDeleteButtonTest() {
        display = new Display();
        shell = new Shell(display);
        shell.setLayout(new FillLayout());

        final Composite baseComposite = new Composite(shell, SWT.BORDER);
        baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        baseComposite.setLayout(new GridLayout());

        final Composite rowsContainerComposite = new Composite(baseComposite, SWT.BORDER);
        rowsContainerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        rowsContainerComposite.setLayout(new GridLayout());

        final Button addButton = new Button(baseComposite, SWT.PUSH);
        addButton.setText("Add");
        addButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                new Row(rowsContainerComposite);
                rowsContainerComposite.layout();
            }

        });
    }

    public void run() {
        shell.setSize(200, 200);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    public static void main(final String... args) {
        new AddDeleteButtonTest().run();
    }

}

我在我的一个项目中做了同样的事情。 Jface/SWT 中的代码有点复杂。在复合材料上添加和删除小部件将是一项繁重的任务。这将降低 UI 性能。

如果您使用 Jface tableviewer 而不是创建复合文件,您将获得更好的 UI 性能和漂亮的外观。在 table 查看器中,您可以在一列中显示文本框,在一列中可以显示按钮。您可以编写 table 列编辑 support/label 提供商以显示按钮。

使用这种方法,您将能够显示所有行的按钮,或者当您单击要添加或删除的任何单元格时。

由于某些原因,我现在无法分享代码片段,但如果您需要,我会在周末分享它