4

现在我可以根据第一个页面选择设置我的第二个向导页面的内容,我正在寻找一种方法来在用户单击第一页上的下一步按钮时将焦点放在第二页的内容上。

默认情况下,当用户单击下一个按钮时,焦点被赋予按钮组合(下一个、返回或完成按钮取决于向导配置)

我发现关注页面内容的唯一方法是以下一种:

public class FilterWizardDialog extends WizardDialog {

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

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

对我来说,为了实现这种行为,必须重写 WizardDialog 类有点“无聊和沉重”。此外,WizardDialog javadoc 说:

客户可以继承WizardDialog,尽管这很少需要。

你觉得这个解决方案怎么样?有没有更简单、更清洁的解决方案来完成这项工作?

4

2 回答 2

7

线程建议:

在您的向导页面中,使用在您的页面显示之前自动调用的继承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();
                }
            }
        );
    }
}
于 2009-06-09T07:30:22.343 回答
0

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();
            }
        });
    }
}
于 2011-03-03T16:36:22.413 回答