2011-10-05 12 views

risposta

8

È possibile disporre semplicemente dello Label e inserire un nuovo Text al suo posto. GridLayout utilizza l'ordine z dei bambini per determinare la posizione nella griglia, quindi sarà necessario utilizzare moveAbove() e moveBelow() sullo Text per poterlo ottenere nella posizione corretta. Quindi chiama il layout() sul genitore. Per esempio:

Text text = new Text(label.getParent(), SWT.BORDER); 
text.moveAbove(label); 
label.dispose(); 
text.getParent().layout(); 

Ecco un widget semplice che illustra esattamente quello che voglio dire:

public class ReplaceWidgetComposite 
    extends Composite 
{ 
    private Label label; 
    private Text text; 
    private Button button; 

    public ReplaceWidgetComposite(Composite parent, int style) 
    { 
     super(parent, style); 

     setLayout(new GridLayout(1, false)); 

     label = new Label(this, SWT.NONE); 
     label.setText("This is a label!"); 

     button = new Button(this, SWT.PUSH); 
     button.setText("Press me to change"); 
     button.addSelectionListener(new SelectionAdapter() 
     { 
      public void widgetSelected(SelectionEvent e) 
      { 
       text = new Text(ReplaceWidgetComposite.this, SWT.BORDER); 
       text.setText("Now it's a text!"); 
       text.moveAbove(label); 
       label.dispose(); 
       button.dispose(); 
       ReplaceWidgetComposite.this.layout(true); 
      } 
     }); 
    } 
} 
+0

Non funziona correttamente. Questo codice causa l'inserimento della cella di testo dopo l'etichetta, ma volevo sostituire l'etichetta. dispose() in qualche modo non rimuove l'etichetta dalla griglia perché è ancora visibile. – alhcr

+0

Smaltire un widget dovrebbe rimuoverlo dal suo genitore. Prova a chiamare 'parent.layout (true)'. –

+0

Sembra che non funzioni così. Ho shell.layout (true); e so che funziona perché il testo è inserito e io lo vedo, ma l'etichetta è ancora visibile. L'hai usato da qualche parte e ha funzionato correttamente? – alhcr

Problemi correlati