我有WizardDialog / Wizard,内容是WizardPage。让我说我在页面内做一些事情,当发生一些错误时,我弹出MessageBox,点击确定后我想强制关闭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异常的情况下强制关闭向导?
答案 0 :(得分:4)
您应该在向导对话框对象上使用“close”方法。要从向导页面调用它,我建议您创建一个回调接口并将其传递给页面。这样的事情:
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方法,这将关闭向导。
希望这有帮助。
答案 1 :(得分:1)
就我而言,唯一可行的选择是:
getShell().setVisible(false);
答案 2 :(得分:1)
这对我有用。
// fatal error situation detected on a wizard page
MessageDialog.openError(getShell(), "Error", "Wizard cannot continue and will now exit.");
getWizard().getContainer().getShell().close();
答案 3 :(得分:0)
此IWizard方法的向导实现使用DialogPage.dispose处理所有页面控件。
如果向导实例维护需要处理的附加SWT资源,则子类应扩展此方法。
(适用的Javadoc)强>
因此,当你处理对话框时,当前页面之后的页面不可见(我认为)和加载,这就是为什么Wizard.close()
很重要(我认为Wizard.getShell().close()
相同)。
方法performCancel应由MyWizard实现,以定义用户单击取消后应该执行的操作,但未在向导中定义。用户单击取消后,向导调用它。例如:
void close(){
dosmthng
performCancel();
dispose();
}
实际上这与performFinish()相当,但是取消了按钮。我希望我很清楚。
也许setVisible(false)
应该有效。
答案 4 :(得分:0)
我认为您在WizardDialog上使用cancelPressed()
方法来关闭向导对话框
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;
}
创建第一个控件,当你想要关闭对话框时,只需写下取消按下
if(ConditiontoClose==true)
getBaseWizardDialog().cancelPressed();
}
}