Domanda

Ho un elemento composito, che inizialmente ha un'etichetta. Ora chiamo dispose su di esso (l'etichetta) e creo 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) venga visualizzato al posto di quello vecchio. Ecco il codice che ho (separato in un unit test per ridisegnare un composito)

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 puoi vedere, sto chiamando ridisegna sul composito dopo aver aggiunto un nuovo elemento. Inoltre, ho verificato che dopo la chiamata a disporre, testCell.getChildren (). Length 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 sto perdendo qualcosa qui?

È stato utile?

Soluzione

Nella funzione changeText () ,

  

testCell.redraw ();

La riga

deve essere sostituita da

  

testCell.layout ();

Oppure, se vuoi ridimensionarlo correttamente, dovresti usare

  

shell.layout ();.

Altri suggerimenti

Direi di aggiungere un selectionListener sull'etichetta.

.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(final SelectionEvent e) {
        //Change text by Label.setText();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top