Eclipse Wizards JFace (Encore une fois ...)
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?
La solution
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();
}
});
}
}