我旁边有一个文本框和一个添加按钮,当我点击添加按钮时,我可以在它旁边添加一个文本框和删除按钮。现在我想要将第一行的添加按钮更改为删除,并且添加按钮应该重新定位在两行以下,当单击第二行删除按钮(第二行被删除)时,添加按钮应该返回到第一行并替换删除按钮。它应该如下所示。
我如何实现这一目标?
答案 0 :(得分:0)
如果您创建Composite
作为排序容器,则可以添加和删除它,以允许外部的所有内容保持正确的顺序。通过保留空格,删除按钮始终位于容器的内容之下。
我旁边有一个文本框和一个添加按钮,当我点击添加按钮时,我可以添加一个文本框并在其旁边删除按钮
例如,如果我们提到的Shell
小Button
,你提到了添加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
(目前空白区域占用了所有可用空间,但您可以根据需要进行更改)
添加行时,您可以添加到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();
}
}
单击第二行删除按钮(删除第二行)时,添加按钮应返回第一行
然后当删除时,行将适当地向后移动:
添加按钮应重新定位在两行
之下
这个想法是通过使用"容器"复合,您需要保留该空间以添加和删除行。删除按钮将在添加和删除行时始终位于行下方。
完整示例:
find
答案 1 :(得分:0)
我在我的一个项目中做了同样的事情。在Jface / SWT中,代码有点复杂。在复合上添加和删除小部件将是一项繁重的任务。这会降低UI性能。
如果您使用Jface tableviewer而不是创建复合,您将获得更好的UI性能和良好的外观。在一列中的表查看器中,您可以显示文本框,在一列中可以显示按钮。您可以编写表格列编辑支持/标签提供程序来显示按钮。
使用这种方法,您可以显示所有行的按钮,或者当您单击要添加或删除的任何单元格时。
由于某些原因,我暂时无法分享代码段,但如果您需要我将在周末分享