Eclipse JFace's Wizards (Опять ...) - PullRequest
4 голосов
/ 09 июня 2009

Теперь, когда я могу установить содержимое страницы моего второго мастера в зависимости от выбора первой страницы, я ищу способ сфокусироваться на содержании моей второй страницы, когда пользователь нажимает на следующая кнопка на первой странице.

По умолчанию, когда пользователь нажимает кнопку «Далее», основное внимание уделяется составной кнопке (кнопка «Далее», «Назад» или «Завершить» в зависимости от конфигурации мастера)

Единственный способ сосредоточиться на содержании моей страницы - следующий:

public class FilterWizardDialog extends WizardDialog {

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

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

Для меня немного "скучно и тяжело" переопределять класс WizardDialog для реализации этого поведения. Более того, Javadoc WizardDialog говорит:

Клиенты могут иметь подкласс WizardDialog, хотя это требуется редко.

Что вы думаете об этом решении? Есть ли более легкое и чистое решение для этой работы?

Ответы [ 2 ]

7 голосов
/ 09 июня 2009

Этот поток предлагает:

На странице мастера используйте унаследованный метод setVisible(), который вызывается автоматически перед отображением вашей страницы:

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

Метод postSetFocusOnDialogField содержит:

/**
 * 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();
                }
            }
        );
    }
}
0 голосов
/ 03 марта 2011

Ответ VonC работает отлично, лично я нашел, что с этим немного проще работать, как это:

@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();
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...