簡體   English   中英

Eclipse RCP / JFace向導 - 如何以編程方式強制從wizardPage強制關閉wizardDialog

[英]Eclipse RCP / JFace Wizard - How to programmatically force close wizardDialog from wizardPage

我有WizardDialog /向導,內容是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異常?

您應該在向導對話框對象上使用“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方法,這將關閉向導。

希望這可以幫助。

此IWizard方法的向導實現使用DialogPage.dispose處理所有頁面控件。

如果向導實例維護需要處理的附加SWT資源,則子類應擴展此方法。

(Javadoc中)

因此,當您處理對話框時,當前頁面之后的頁面不可見(我認為)並且已加載,這就是Wizard.close()Wizard.close()對於Wizard.getShell().close()我認為是相同的)。 方法performCancel應由MyWizard實現,以定義用戶單擊取消后應該執行的操作,但未在向導中定義。 用戶單擊取消后,向導調用它。 例如 :

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

實際上這相當於performFinish(),但是取消了按鈕。 我希望我很清楚。

也許setVisible(false)應該有效。

我認為你在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();

}

}

就我而言,唯一有效的選擇是:

getShell().setVisible(false);

這對我有用。

 // fatal error situation detected on a wizard page
 MessageDialog.openError(getShell(), "Error", "Wizard cannot continue and will now exit.");
 getWizard().getContainer().getShell().close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM