Frage

Nun, da ich ist in der Lage, den Inhalt meines zweiten Assistenten Seite je auf der ersten Seite zu setzen Auswahl, bin ich nach einer Möglichkeit, den Fokus auf meine zweite Seite Inhalt zu geben, wenn der Benutzer klickt auf die Schaltfläche weiter auf der ersten Seite.

In der Standardeinstellung, wenn der Benutzer die nächste Schaltfläche klicken, wird der Fokus auf die Schaltfläche Verbund gegeben ist (neben, Rücken oder Beendigungstaste in Abhängigkeit von der Assistenten-Konfiguration)

Der einzige Weg, ich den Fokus auf meine Seite Inhalt zu geben, zu finden ist die folgende:

public class FilterWizardDialog extends WizardDialog {

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

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

Für mich ist es ein wenig „langweilig und schwer“, um die WizardDialog Klasse, um außer Kraft setzen zu müssen, um dieses Verhalten zu implementieren. Mehr über die WizardDialog javadoc sagt:

  

Clients können WizardDialog Unterklasse, obwohl dies erforderlich ist selten.

Was denken Sie über diese Lösung? Gibt es eine einfachere und sauberere Lösung, die Arbeit zu tun?

War es hilfreich?

Lösung

Der Thread schlägt vor:

  

Ihre Seite des Assistenten verwenden, um die setVisible() Methode geerbt, die automatisch aufgerufen wird, bevor die Seite angezeigt wird:

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

Die postSetFocusOnDialogField Methode enthält:

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

Andere Tipps

VonC Antwort funktioniert gut, ich persönlich fand es ein wenig einfacher zu sein, mit zu arbeiten, wie dies obwohl:

@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();
            }
        });
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top