Вопрос

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

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

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

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, хотя это требуется редко.

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

Это было полезно?

Решение

Этот нить предлагает:

На странице мастера используйте унаследованный 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();
                }
            }
        );
    }
}

Другие советы

Ответ 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();
            }
        });
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top