SWT / JFace: rimuovere i widget
Domanda
Group group = new Group(parent, SWT.NONE);
StyledText comment = new StyledText(group, SWT.BORDER_DASH);
Questo crea un gruppo con un area di testo al suo interno.
Come posso poi eliminare il testo (rimuoverla dallo schermo in modo che possa sostituirlo con qualcos'altro)?
Soluzione
Usa 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();
}
}
Altri suggerimenti
Un'altra opzione è quella di utilizzare un stackLayout per passare tra sottostante controlli. Ciò impedisce di incorrere in un errore di "widget è disposto".
Bisogna o chiamare comment.changeParent(newParent)
o comment.setVisible(false)
rimuovere / nascondere dal Gruppo. Io sono sicuro se comment.changeParent(null)
avrebbe funzionato, ma mi avrebbe dato che una prova.
Lo facciamo in questo modo perché SWT utilizza il Composite modello .
group.getChildren()[0].dispose()
rimuoverà il primo bambino. Hai bisogno di trovare un modo per identificare il bambino precisa che si desidera eliminare. Si potrebbe confrontando l'id. È possibile farlo usando il setData / getData su quella di controllo:
Ad esempio:
StyledText comment = new StyledText(group, SWT.BORDER_DASH);
comment.setData("ID","commentEditBox");
e poi:
for (Control ctrl : group.getChildren()) {
if (control.getData("ID").equals("commentEditBox")) {
ctrl.dispose();
break;
}
}