SWT / JFace:删除小部件

Group group = new Group(parent, SWT.NONE); StyledText comment = new StyledText(group, SWT.BORDER_DASH); 

这将创建一个内部带有文本区域的组。

我以后如何删除文本(从屏幕上删除它,以便我可以用其他东西替换它)?

使用Widget.dispose。

 public class DisposeDemo { private static void addControls(final Shell shell) { shell.setLayout(new GridLayout()); Button button = new Button(shell, SWT.PUSH); button.setText("Click to remove all controls from shell"); button.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent event) {} @Override public void widgetSelected(SelectionEvent event) { for (Control kid : shell.getChildren()) { kid.dispose(); } } }); for (int i = 0; i < 5; i++) { Label label = new Label(shell, SWT.NONE); label.setText("Hello, World!"); } shell.pack(); } public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); addControls(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } 

另一种选择是使用StackLayout在底层控件之间切换。 这可以防止您遇到“小部件被丢弃”错误。

您必须调用comment.changeParent(newParent)comment.setVisible(false)才能从组中删除/隐藏它。 我不确定comment.changeParent(null)是否可行,但我会尝试一下。

我们这样做是因为SWT使用复合模式 。

group.getChildren()[0].dispose()将删除第一个子group.getChildren()[0].dispose() 。 您需要找到一种方法来识别要删除的精确子项。 它可以比较id。 您可以通过在该控件上使用setData / getData来执行此操作:

例如:

 StyledText comment = new StyledText(group, SWT.BORDER_DASH); comment.setData("ID","commentEditBox"); 

接着:

 for (Control ctrl : group.getChildren()) { if (control.getData("ID").equals("commentEditBox")) { ctrl.dispose(); break; } }