Eclipse RCP / JFace向导 - 如何以编程方式强制从wizardPage强制关闭wizardDialog

时间:2013-08-20 12:24:48

标签: java swt eclipse-rcp jface

我有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异常的情况下强制关闭向导?

5 个答案:

答案 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();

}

}