现在我在第一页选择时am able to set the content of my second wizard's page depending,我正在寻找一种方法,当用户点击第一页上的下一个按钮时,将焦点放在第二页的内容上。
默认情况下,当用户单击下一个按钮时,焦点将放在按钮合成上(下一个,后退或完成按钮,具体取决于向导配置)
我发现将焦点放在页面内容上的唯一方法是:
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
,但这很少需要。
您对此解决方案有何看法?是否有更简单,更清洁的解决方案来完成这项工作?
答案 0 :(得分:7)
这thread表明:
在向导页面中,使用在页面显示之前自动调用的继承
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();
}
}
);
}
}
答案 1 :(得分: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();
}
});
}
}