2009-06-21 15 views
10

Ho un elemento composito, che inizialmente ha un'etichetta. Ora chiamo gettare su di esso (l'etichetta) e creare un'altra etichetta nello stesso contenitore (olmo composito), ma non vedo il nuovo testo. Mi porta a chiedermi come abilitare il ridisegno sul composito, in modo che la nuova etichetta (o qualsiasi altro componente che potrei creare) renderà al posto di quella vecchia. Ecco il codice che ho (separati in uno unit test per ridisegnare un composito)SWT composito - problema di ridisegno

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

Come potete vedere, sto chiamando ridisegna sul composito dopo aggiungo un nuovo elemento. Inoltre, ho verificato che dopo la chiamata di dispose, la lunghezza testCell.getChildren(). Restituisce 0, come previsto, e quando creo una nuova etichetta, ottengo la stessa espressione per restituire 1, verificando che il nuovo elemento stia effettivamente ottenendo aggiunto al contenitore composito padre Mi manca qualcosa qui?

risposta

22

Nella funzione changeText(), la linea

testCell.redraw();

dovrebbe essere sostituito da

testCell.layout();

Oppure, se si vuole ridimensionare i t correttamente si dovrebbe usare

shell.layout();.

+2

spiacenti per rilanciare questo argomento, ma mi è stato di recente cercavo per soluzione del problema simile e questo tema ha aiutato molto, ma per ridimensionare la mia finestra ho dovuto usare 'shell.pack()' 'perché shell.layout() 'non ha fatto nulla. Potrebbe essere utile per qualcuno. :) – mykola

+0

@mykola: 'shell.pack()' ha reso la mia finestra più piccola e lo ha ridisegnato, ma 'shell.layout()' lo ha ridisegnato e mantenuto le sue dimensioni. Stavo aggiungendo i controlli a una finestra dopo 'shell.open()' e i controlli non venivano visualizzati. 'shell.layout()' l'ha risolto. – gregn3

+0

Dato javadoc su layout(), 'testCell.requestLayout();' sarebbe anche meglio – titou10

-5

Direi di aggiungere una selezioneListener sull'etichetta.

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