2009-04-01 32 views
12
Group group = new Group(parent, SWT.NONE); 
StyledText comment = new StyledText(group, SWT.BORDER_DASH); 

Esto crea un grupo con un área de texto dentro.SWT/JFace: eliminar widgets

¿Cómo puedo eliminar el texto más tarde (eliminarlo de la pantalla para poder reemplazarlo por otra cosa)?

Respuesta

7

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

Debe llamar al comment.changeParent(newParent) o comment.setVisible(false) para eliminarlo/ocultarlo del grupo. No estoy seguro de si comment.changeParent(null) funcionaría, pero lo probaría.

Lo hacemos de esta manera porque SWT usa el Composite Pattern.

+3

comment.changeParent (nulo) plantea de hecho SWT.ERROR_NULL_ARGUMENT. .. – Thilo

2

Otra opción es utilizar un StackLayout para cambiar entre los controles subyacentes. Esto evita que se ejecute en un error "widget está dispuesto".

0

group.getChildren()[0].dispose() eliminará el primer hijo. Necesita encontrar una forma de identificar el niño preciso que desea eliminar. Podría estar comparando el id. Puede hacerlo utilizando el setData/getData en que el control:

Por ejemplo:

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

y luego:

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