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?

¿Fue útil?

Solución

Esta sugiere:

  

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();
            }
        });
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top