如何更换按钮并动态定位?

时间:2017-06-07 19:09:32

标签: swt jface

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

enter image description here

enter image description here

我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

如果您创建Composite作为排序容器,则可以添加和删除它,以允许外部的所有内容保持正确的顺序。通过保留空格,删除按钮始终位于容器的内容之下。

  

我旁边有一个文本框和一个添加按钮,当我点击添加按钮时,我可以添加一个文本框并在其旁边删除按钮

例如,如果我们提到的ShellButton,你提到了添加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"); 小部件添加到的空格:

rowsContainerComposite

enter image description here

(目前空白区域占用了所有可用空间,但您可以根据需要进行更改)

添加行时,您可以添加到addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { new Row(rowsContainerComposite); rowsContainerComposite.layout(); } });

Row

示例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(); } }); } } 类:

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();
    }

}

enter image description here

  

单击第二行删除按钮(删除第二行)时,添加按钮应返回第一行

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

enter image description here

  

添加按钮应重新定位在两行

之下

这个想法是通过使用"容器"复合,您需要保留该空间以添加和删除行。删除按钮将在添加和删除行时始终位于行下方。

完整示例:

find

答案 1 :(得分:0)

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

如果您使用Jface tableviewer而不是创建复合,您将获得更好的UI性能和良好的外观。在一列中的表查看器中,您可以显示文本框,在一列中可以显示按钮。您可以编写表格列编辑支持/标签提供程序来显示按钮。

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

由于某些原因,我暂时无法分享代码段,但如果您需要我将在周末分享