Волшебники Eclipse JFace (опять…)
Вопрос
Теперь, когда я я могу настроить содержимое страницы моего второго мастера в зависимости при выборе первой страницы я ищу способ сосредоточить внимание на содержимом моей второй страницы, когда пользователь нажимает кнопку «Далее» на первой странице.
По умолчанию, когда пользователь нажимает кнопку «Далее», фокус передается составной кнопке (кнопке «Далее», «Назад» или «Готово» в зависимости от конфигурации мастера).
Единственный способ сосредоточить внимание на содержимом моей страницы — это следующий:
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();
}
});
}
}