如何替换按钮并动态重新定位?
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 提供商以显示按钮。
使用这种方法,您将能够显示所有行的按钮,或者当您单击要添加或删除的任何单元格时。
由于某些原因,我现在无法分享代码片段,但如果您需要,我会在周末分享它
我旁边有一个文本框和一个添加按钮,当我单击添加按钮时,我可以在它旁边添加一个文本框和删除按钮。现在我想将第一行的添加按钮更改为删除,并且添加按钮应该重新定位在两行下方,当点击第二行删除按钮(第二行被删除)时,添加按钮应该回到第一行并替换删除按钮。它应该如下所示。
我该如何实现?
如果您创建一个 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 提供商以显示按钮。
使用这种方法,您将能够显示所有行的按钮,或者当您单击要添加或删除的任何单元格时。
由于某些原因,我现在无法分享代码片段,但如果您需要,我会在周末分享它