Question

J'ai un élément composite, qui a initialement une étiquette. J'appelle maintenant disposer sur le (l'étiquette) et crée une autre étiquette dans le même conteneur (composite orme), mais je ne vois pas le nouveau texte. Cela m'amène à me demander comment puis-je activer le redessinage sur le composite, de sorte que la nouvelle étiquette (ou tout autre composant que je pourrais créer) s'affiche à la place de l'ancienne. Voici le code que j'ai (séparé en un test unitaire pour redessiner un composite)

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 constater, j'appelle redessiner sur le composite après avoir ajouté un nouvel élément. En outre, j'ai vérifié qu'après l'appel à la disposition, testCell.getChildren (). Length renvoie 0, comme prévu, et lorsque je crée une nouvelle étiquette, la même expression est renvoyée à 1, vérifiant que le nouvel élément est bien en train de recevoir ajouté à son conteneur composite parent Est-ce que je manque quelque chose ici?

Était-ce utile?

La solution

Dans la fonction changeText () , le

  

testCell.redraw ();

La ligne

doit être remplacée par

  

testCell.layout ();

Ou, si vous souhaitez le redimensionner correctement, vous devez utiliser

  

shell.layout (); .

Autres conseils

Je dirais d'ajouter une sélectionListener sur l'étiquette.

.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(final SelectionEvent e) {
        //Change text by Label.setText();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top