2009-06-21 9 views
10

Tengo un elemento compuesto, que inicialmente tiene una etiqueta. Ahora llamo a deshacerse de él (la etiqueta) y crear otra etiqueta en el mismo contenedor (olmo compuesto), pero no veo el nuevo texto. Me lleva a preguntarme cómo habilito el redibujado en el compuesto, de modo que la nueva etiqueta (o cualquier otro componente que pueda crear) represente en lugar de la anterior. Aquí está el código que tengo (separados en una unidad de prueba para volver a dibujar un composite)compilación SWT - problema de redibujado

private Label createLabel(Composite parent) { 
    Label label = new Label(parent, SWT.NONE); 
    label.setAlignment(SWT.CENTER); 
    label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); 
    return label; 
} 

private void changeText() { 
    assert testCell != null : "Please initialize test cell"; 
    testCell.getChildren()[0].dispose(); 
    Label l = createLabel(testCell); 
    l.setText("New TexT"); 
    testCell.redraw(); 
} 

private void draw() { 
    Display display = new Display(); 
    shell = new Shell(display); 
    shell.setLayout(new GridLayout(2,false)); 

    testCell = new Composite(shell,SWT.BORDER); 
    testCell.setLayout(new GridLayout()); 
    Label l = createLabel(testCell); 
    l.setText("Old Text"); 
    Composite btnCell = new Composite(shell,SWT.NONE); 
    btnCell.setLayout(new GridLayout()); 
    Button b = new Button(btnCell, SWT.PUSH); 
    b.setText("Change"); 
    b.addListener(SWT.MouseDown, new Listener() { 
     public void handleEvent(Event e) { 
      changeText(); 
     } 
    }); 

Como se puede ver, yo estoy llamando a volver a dibujar en el compuesto después agrego un nuevo elemento. Además, he verificado que después de la llamada para desechar, testCell.getChildren(). Length devuelve 0, como se esperaba, y cuando creo una nueva etiqueta, obtengo la misma expresión para devolver 1, verificando que el nuevo elemento realmente está obteniendo agregado a su contenedor compuesto principal ¿Me falta algo aquí?

Respuesta

22

En la función changeText(), la línea

testCell.redraw();

debe ser sustituido por

testCell.layout();

O, si desea cambiar el tamaño i t correctamente debería usar

shell.layout();.

+2

Lo siento por la reactivación de este tema, pero yo estaba recientemente en busca de solución del problema similar y este tema ha ayudado mucho, pero para cambiar el tamaño de la ventana que tenía que usar 'shell.pack()' 'porque shell.layout() 'no hizo nada. Puede ser que sea útil para alguien. :) – mykola

+0

@mykola: 'shell.pack()' redujo mi ventana y la rediseñé, pero 'shell.layout()' la redibujó y mantuvo su tamaño. Estaba agregando controles a una ventana después de 'shell.open()' y los controles no aparecían. 'shell.layout()' lo resolvió. – gregn3

+0

Dado el javadoc en el diseño(), 'testCell.requestLayout();' sería incluso mejor – titou10

-5

Yo diría que añada una selección de oyente en la etiqueta.

.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(final SelectionEvent e) { 
     //Change text by Label.setText(); 
    } 
} 
Cuestiones relacionadas