Eclipse Wizards di JFace (Anche in questo caso ...)
Domanda
Ora che ho sono in grado di impostare il contenuto della pagina a seconda mia seconda del mago sulla prima pagina selezione, Cerco un modo per dare l'attenzione al contenuto mia seconda della pagina quando l'utente fa clic sul pulsante Avanti sulla prima pagina.
Per impostazione predefinita, quando l'utente clicca sul pulsante accanto, l'attenzione è data al pulsante composito (Avanti, Indietro o il tasto finitura a seconda della configurazione wizard)
L'unico modo che ho trovato per dare attenzione al contenuto del mio pagina è la seguente:
public class FilterWizardDialog extends WizardDialog {
public FilterWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
}
@Override
protected void nextPressed() {
super.nextPressed();
getContents().setFocus();
}
}
Per me è un po ' "noioso e pesante" di dover sostituire la classe WizardDialog al fine di attuare questo comportamento. Più sopra, il javadoc WizardDialog dice:
I clienti possono creare una sottoclasse
WizardDialog
, anche se questo è raramente necessaria.
Che ne pensate di questa soluzione? C'è qualche soluzione più semplice e più pulito per fare questo lavoro?
Soluzione
Nella pagina della procedura guidata, utilizzare il metodo
setVisible()
ereditaria che viene chiamato automaticamente prima viene mostrata la tua pagina:
public void setVisible(boolean visible) {
super.setVisible(visible);
// Set the initial field focus
if (visible) {
field.postSetFocusOnDialogField(getShell().getDisplay());
}
}
Il metodo 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();
}
}
);
}
}
Altri suggerimenti
La risposta di VonC grandi opere, personalmente ho trovato ad essere un po 'più facile lavorare con come questo però:
@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();
}
});
}
}