4

我有 WizardDialog/Wizard,内容是 WizardPage。假设我在 Page 内做某事,当发生一些错误时,我会弹出 MessageBox,单击 OK 后我想强制关闭 WizardDialog。

不好的方法是调用:

getShell().dispose;

因为 SWT 抛出异常:

!ENTRY org.eclipse.ui 4 0 2013-08-20 14:15:13.353
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.swt.SWTException: Widget is disposed

相反,当我打电话时:

getWizard().performCancel();

它什么也不做。

如何在没有 SWT 异常的情况下强制关闭向导?

4

5 回答 5

4

您应该在向导对话框对象上使用“关闭”方法。要从向导页面调用它,我建议您制作一个回调接口并将其传递给页面。像这样的东西:

final YourWizard wizard = new YourWizard ();
WizardDialog wizardDialog = new WizardDialog(shell, wizard);

wizard.setErrorhandler(new YourCustomErrorHandlerInterface() {

        @Override
        public void onError() {
            wizardDialog.close();
        }
});
wizardDialog .open();

之后,当创建向导页面时,您将 YourCustomErrorHandlerInterface 传递给它。当发生错误时,只需调用 YourCustomErrorHandlerInterface#onError 方法,该方法将关闭向导。

希望这可以帮助。

于 2013-08-20T14:53:25.900 回答
0

I think you use cancelPressed() method on WizardDialog for close wizard dialog

BaseWizard baseWizard=new BaseWizard();
BaseWizardDialog baseWizardDialog=new BaseWizardDialog(getShell(),baseWizard);
baseWizard.setBaseWizardDialog(baseWizardDialog);
baseWizardDialog.open();




public class BaseWizard extends Wizard  {
private BaseWizardDialog baseWizardDialog=null;
private BaseWizardPage baseWizardPage;
public BaseWizard()
    {
    super();
    setWindowTitle("My Wizard");
        baseWizardPage=new BaseWizardPage();

    }
public void setBaseWizardDialog(BaseWizardDialog baseWizardDialog) {
        this.baseWizardDialog = baseWizardDialog;
        baseWizardPage.setBaseWizardDialog(this.baseWizardDialog);
    }

    public BaseWizardDialog getBaseWizardDialog() {
        return baseWizardDialog;
    }
}

public class BaseWizardPage extends WizardPage {

public void createControl(Composite parent) {
private BaseWizardDialog baseWizardDialog=null;
public void setBaseWizardDialog(BaseWizardDialog baseWizardDialog) {
        this.baseWizardDialog = baseWizardDialog;
    }

    public BaseWizardDialog getBaseWizardDialog() {
        return baseWizardDialog;
    }

create first control and when you want to close the dialog simply write cancel pressed

if(ConditiontoClose==true)
getBaseWizardDialog().cancelPressed();

}

}
于 2014-01-29T11:53:08.423 回答
0

此 IWizard 方法的向导实现使用 DialogPage.dispose 释放所有页面控件。

如果向导实例维护需要释放的附加 SWT 资源,则子类应扩展此方法。

(Java 文档)

因此,当您处理对话框时,当前页面之后的页面不可见(我认为)并已加载,这就是Wizard.close()重要的原因(Wizard.getShell().close()我认为也是如此)。方法 performCancel 应由 MyWizard 实现,以定义用户单击取消后应执行的操作,但在 Wizard 中未定义。用户点击取消后由向导调用。例如 :

void close(){
     dosmthng
     performCancel();
     dispose();
}

事实上,这与 performFinish() 等价,但使用的是取消按钮。我希望我很清楚。

也许setVisible(false)应该工作。

于 2013-08-20T13:43:30.697 回答
0

就我而言,唯一可行的选择是:

getShell().setVisible(false);
于 2015-08-14T12:27:59.560 回答
0

这对我有用。

 // fatal error situation detected on a wizard page
 MessageDialog.openError(getShell(), "Error", "Wizard cannot continue and will now exit.");
 getWizard().getContainer().getShell().close();
于 2016-02-01T08:10:36.197 回答