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

Questo crea un gruppo con un'area di testo all'interno.SWT/JFace: rimuovi widget

Come posso eliminare in seguito il testo (rimuoverlo dallo schermo in modo che possa sostituirlo con qualcos'altro)?

risposta

7

Utilizzare 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

È necessario chiamare comment.changeParent(newParent) o comment.setVisible(false) per rimuoverlo/nasconderlo dal gruppo. Non sono sicuro che lo comment.changeParent(null) funzionerebbe ma vorrei provarlo.

Lo facciamo in questo modo perché SWT utilizza lo Composite Pattern.

+3

comment.changeParent (null) non effettivamente aumentare SWT.ERROR_NULL_ARGUMENT. .. – Thilo

2

Un'altra opzione è utilizzare uno StackLayout per passare tra i controlli sottostanti. Questo ti impedisce di incappare in un errore "widget è disposto".

0

group.getChildren()[0].dispose() rimuoverà il primo figlio. Devi trovare un modo per identificare il bambino preciso che desideri eliminare. Potrebbe essere confrontando l'id. È possibile farlo usando il setData/getData su quel 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; 
} 
}