2009-06-21 7 views
10

J'ai un élément composite, qui a initialement un Label. Maintenant, j'appelle disposer sur l'étiquette (le label) et créer une autre étiquette dans le même conteneur (orme composite), mais je ne vois pas le nouveau texte. Cela m'amène à me demander comment activer le redessin sur le composite, afin que le nouveau label (ou tout autre composant que je pourrais créer) soit rendu à la place de l'ancien. Voici le code que j'ai (séparé en un test unitaire pour redessiner un composite)Composant SWT - problème de redessiner

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

Comme vous pouvez le voir, j'appelle redessiner le composite après ajouter un nouvel élément. En outre, j'ai vérifié qu'après l'appel à disposer, testCell.getChildren(). Length renvoie 0, comme prévu, et quand je crée une nouvelle étiquette, j'obtiens la même expression pour retourner 1, vérifiant que le nouvel élément ajouté à son conteneur composite parent Ai-je raté quelque chose ici?

Répondre

22

Dans la fonction changeText(), la

testCell.redraw();

ligne

devrait être remplacé par

testCell.layout();

Ou, si vous voulez redimensionner i t correctement vous devez utiliser

shell.layout();.

+2

Désolé pour la relance de ce sujet, mais je cherchais récemment pour la solution du problème similaire et ce sujet a beaucoup aidé mais pour redimensionner ma fenêtre je devais utiliser 'shell.pack()' 'parce que shell.layout() 'n'a rien fait. Peut-être que ce sera utile pour quelqu'un. :) – mykola

+0

@mykola: 'shell.pack()' a rendu ma fenêtre plus petite et l'a redessinée, mais 'shell.layout()' l'a redessinée et a gardé sa taille. J'ajoutais des contrôles à une fenêtre après 'shell.open()' et les contrôles ne s'affichaient pas. 'shell.layout()' l'a résolu. – gregn3

+0

Étant donné le javadoc sur layout(), 'testCell.requestLayout();' serait encore mieux – titou10

-5

Je dirais ajouter un selectionListener sur l'étiquette.

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