Eclipse JFace assistentes (Mais uma vez ...)
Pergunta
Agora que eu sou capaz de definir o conteúdo da página, dependendo minha segunda do assistente na primeira página selecção, eu estou procurando uma maneira de dar o foco para o conteúdo minha segunda página quando o usuário clica no botão ao lado na primeira página.
Por padrão, quando o usuário clica no botão seguinte, o foco é dado ao composto botão (ao lado, para trás ou acabamento botão dependendo da configuração do assistente)
A única maneira que eu encontrei para dar o foco para o conteúdo da minha página é o seguinte:
public class FilterWizardDialog extends WizardDialog {
public FilterWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
}
@Override
protected void nextPressed() {
super.nextPressed();
getContents().setFocus();
}
}
Para mim é um pouco "chato e pesado" ter que substituir a classe WizardDialog, a fim de implementar esse comportamento. Mais ainda, o javadoc WizardDialog diz:
Os clientes podem subclasse
WizardDialog
, embora isso raramente é necessário.
O que você acha sobre essa solução? Existe alguma solução mais fácil e mais limpa para fazer esse trabalho?
Solução
Este fio sugere:
Na sua página do assistente, use o método
setVisible()
hereditária que é chamado automaticamente antes de sua página é mostrada:
public void setVisible(boolean visible) {
super.setVisible(visible);
// Set the initial field focus
if (visible) {
field.postSetFocusOnDialogField(getShell().getDisplay());
}
}
O método postSetFocusOnDialogField contém:
/**
* 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();
}
}
);
}
}
Outras dicas
A resposta de VonC funciona muito bem, eu pessoalmente achei que fosse um pouco mais fácil trabalhar com assim que:
@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();
}
});
}
}