Pergunta

Agora que eu sou capaz de definir o conteúdo da página, dependendo minha segunda do assistente na primeira página selecção, eu estou procurando uma maneira de dar o foco para o conteúdo minha segunda página quando o usuário clica no botão ao lado na primeira página.

Por padrão, quando o usuário clica no botão seguinte, o foco é dado ao composto botão (ao lado, para trás ou acabamento botão dependendo da configuração do assistente)

A única maneira que eu encontrei para dar o foco para o conteúdo da minha página é o seguinte:

public class FilterWizardDialog extends WizardDialog {

    public FilterWizardDialog(Shell parentShell, IWizard newWizard) {
        super(parentShell, newWizard);
    }

    @Override
    protected void nextPressed() {
        super.nextPressed();
        getContents().setFocus();
    }
}

Para mim é um pouco "chato e pesado" ter que substituir a classe WizardDialog, a fim de implementar esse comportamento. Mais ainda, o javadoc WizardDialog diz:

Os clientes podem subclasse WizardDialog, embora isso raramente é necessário.

O que você acha sobre essa solução? Existe alguma solução mais fácil e mais limpa para fazer esse trabalho?

Foi útil?

Solução

Este fio sugere:

Na sua página do assistente, use o método setVisible() hereditária que é chamado automaticamente antes de sua página é mostrada:

public void setVisible(boolean visible) {
   super.setVisible(visible);
   // Set the initial field focus
   if (visible) {
      field.postSetFocusOnDialogField(getShell().getDisplay());
   }
}

O método postSetFocusOnDialogField contém:

/**
 * Posts <code>setFocus</code> to the display event queue.
 */
public void postSetFocusOnDialogField(Display display) {
    if (display != null) {
        display.asyncExec(
            new Runnable() {
                public void run() {
                    setFocus();
                }
            }
        );
    }
}

Outras dicas

A resposta de VonC funciona muito bem, eu pessoalmente achei que fosse um pouco mais fácil trabalhar com assim que:

@Override
public void setVisible(boolean visible) {
    super.setVisible(visible);
    if (visible) {
        Control control = getControl();
        if (!control.setFocus()) {
            postSetFocus(control);
        }
    }
}

private void postSetFocus(final Control control) {
    Display display = control.getDisplay();
    if (display != null) {
        display.asyncExec(new Runnable() {
            @Override
            public void run() {
                control.setFocus();
            }
        });
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top