Question

Maintenant que je suis en mesure de définir le contenu de ma deuxième page de l'assistant en fonction sur la première page sélection, Je cherche un moyen de donner le focus à mon 2ème contenu de la page lorsque l'utilisateur clique sur le bouton suivant sur la première page.

Par défaut, lorsque l'utilisateur clique sur le bouton suivant, l'accent est mis sur l'assemblage de bouton (à côté, le dos ou sur le bouton d'arrivée en fonction de la configuration de l'assistant)

La seule manière que je trouvais pour donner le focus au contenu de ma page est la suivante:

public class FilterWizardDialog extends WizardDialog {

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

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

Pour moi, ce qui est un peu « ennuyeux et lourd » devoir remplacer la classe WizardDialog afin de mettre en œuvre ce comportement. En plus, le javadoc WizardDialog dit:

  

Les clients peuvent sous-classe WizardDialog, bien que cela soit rarement nécessaire.

Que pensez-vous de cette solution? Y at-il une solution plus facile et plus propre pour faire ce travail?

Était-ce utile?

La solution

suggère:

  

Dans votre page de l'assistant, utilisez la méthode héritée setVisible() qui est appelée automatiquement avant que votre page est affichée:

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

La méthode de postSetFocusOnDialogField contient:

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

Autres conseils

La réponse de VonC fonctionne très bien, personnellement, je trouve qu'il est un peu plus facile de travailler avec comme celui-ci si:

@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();
            }
        });
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top