Pergunta

Eu tenho um elemento composto, que inicialmente tem um Label. Agora eu chamo de dispor sobre o que (a etiqueta) e criar outro rótulo no mesmo recipiente (elm composto), mas eu não ver o novo texto. Isso me traz à pergunta como faço para permitir redesenhar o composto, para que a nova etiqueta (ou qualquer outro componente que pode criar) irá processar no lugar do antigo. Aqui é o código que têm (separados em uma unidade de teste para redesenhar um composto)

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 você pode ver, eu estou chamando redesenho na composta depois que eu adicionar um novo elemento. Além disso, tenho verificado que após a chamada de dispor, testCell.getChildren (). Length retorna 0, como esperado, e quando eu criar uma nova etiqueta, fico com a mesma expressão para retornar 1, verificando que o novo elemento é realmente ficando adicionado ao seu recipiente compósito pai Estou faltando alguma coisa aqui?

Foi útil?

Solução

Na função changeText(), o

testCell.redraw();

linha deve ser substituído por

testCell.layout();

Ou, se você quiser redimensioná-la corretamente, você deve usar

shell.layout();.

Outras dicas

Eu diria adicionar um selectionListener no rótulo.

.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(final SelectionEvent e) {
        //Change text by Label.setText();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top