2011-10-05 12 views

Respuesta

8

Usted puede simplemente disponer del Label y poner un nuevo Text en su lugar. GridLayout usa el orden z de los niños para determinar la ubicación en la cuadrícula, por lo que deberá usar moveAbove() y moveBelow() en el Text para obtenerlo en la ubicación correcta. Luego llame al layout() en el padre. Por ejemplo:

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

Aquí es un widget simple que ilustra exactamente lo que quiero decir:

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

No funciona correctamente. Este código provoca la inserción de la celda de texto después de la etiqueta, pero quería reemplazar la etiqueta. dispose() de alguna manera no elimina la etiqueta de la cuadrícula porque todavía está visible. – alhcr

+0

La eliminación de un widget debería eliminarlo de su principal. Intenta llamar a 'parent.layout (true)'. –

+0

Parece que no funciona así. Tengo shell.layout (verdadero); y sé que funciona porque el texto está insertado y lo veo, pero la etiqueta todavía está visible. ¿Lo usaste en alguna parte y funcionó correctamente? – alhcr

Cuestiones relacionadas