在开发RCP项目的时候,如何控制Wizard中的next和finish按钮呢?
一般我们的wizardpage页面都是继承了WizardPage,查看API里面有两个方法可以控制,一个是 void setPageComplete(boolean) ,一个是boolean canFlipToNextPage()
setPageComplete(boolean) 是控制当前页面的finish按钮是否可用,我们可以设置setPageComplete(false) 让按钮不可用;
canFlipToNextPage 用于控制next按钮是否可用,一般来说都是重新该方法,里面的逻辑判断来控制next是否可用;
当然,在开发的过程我也遇到,我已经重写了canFlipToNextPage方法了,但是不起效果,而且是等到第二遍的时候才开始更新按钮的状态,不知道为什么。后来看它的源代码,发现一个方法getContainer().updateButtons();,该方法是更新容器里面的按钮状态的,结果发现OK,可以立即更新按钮状态了
最后遇到了一个最棘手的问题,最后一页的finish按钮不能使用了,我设置的setPageComplete(true)。按道理来说,Wizard向导的最后一页的finish按钮就应该会显示,但是结果令人费解。后来看了他的源代码,发现 最后一页的finish按钮是通过canFinish()来控制的(canFinish()是父类Wizard中的方法),而canFinish的写法如下:
/*
* (non-Javadoc) Method declared on IWizard.
*/
public boolean canFinish() {
// Default implementation is to check if all pages are complete.
for (int i = 0; i < pages.size(); i++) {
if (!((IWizardPage) pages.get(i)).isPageComplete()) {
return false;
}
}
return true;
}
发现,只有当Wizard向导中之前所有的页面的isPageComplete都为true的时候,最有一页的finish才可以显示,于是解决方案就出来:
我在最有一页的方法里面,把之前的WizardPage 中setPageComplete(true)不久OK 了么,
//确保前两个页面的pageComplete是正确的
for(int i = 0;i<getWizard().getPageCount();i++){
IWizardPage[] pages = getWizard().getPages();
((WizardPage)pages[i]).setPageComplete(true);
}
getContainer().updateButtons();//立即更改按钮情况
到此两个疑问就解决了......