[英]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.