Eclipse Wizards de JFace (otra vez ...)
Pregunta
Ahora que lo soy capaz de establecer el contenido de la página en función de mi segundo asistente en la primera página la selección, estoy buscando una manera de dar el foco al contenido de mi segunda página cuando el usuario hace clic en el botón siguiente en la primera página.
Por defecto, cuando el usuario haga clic en el botón siguiente, se da el foco al botón de compuesto (al lado, hacia atrás o el botón de acabado en función de la configuración del asistente)
La única manera que encontré para dar el foco al contenido de mi página es la siguiente:
public class FilterWizardDialog extends WizardDialog {
public FilterWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
}
@Override
protected void nextPressed() {
super.nextPressed();
getContents().setFocus();
}
}
Para mí es un poco "aburrido y pesado" a tener que sustituir la clase de WizardDialog con el fin de implementar este comportamiento. Más encima, el Javadoc WizardDialog dice:
Los clientes pueden subclase
WizardDialog
, aunque esto rara vez se requiere.
¿Qué opinas acerca de esta solución? ¿Hay alguna solución más fácil y más limpio para hacer ese trabajo?
Solución
En la página del asistente, utilice el método
setVisible()
heredada que se llama automáticamente antes de que aparezca su página:
public void setVisible(boolean visible) {
super.setVisible(visible);
// Set the initial field focus
if (visible) {
field.postSetFocusOnDialogField(getShell().getDisplay());
}
}
El método postSetFocusOnDialogField contiene:
/**
* 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();
}
}
);
}
}
Otros consejos
La respuesta de VonC funciona muy bien, Yo he encontrado que sea un poco más fácil de trabajar con esto, sin embargo, como:
@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();
}
});
}
}