也说WizardPage动态生成

来源:互联网 发布:fastboot的软件 编辑:程序博客网 时间:2024/05/16 02:29

    在Eclipse中一个Wizard=WizardDialog+Wizard+WizardPage,在这三者中,可以把前者看成后者的容器(container),看看这些类里面的代码就知道,Eclipse自己也是这么认为的,而我们最终看到的东西是WizardPage,在一个Wizard中虽然我们看到的是每一个WizardPage都是在点击next的时候一个一个显示的,但是他们的创建却是在Wizard初始化的时候一起被实例化的,因此这个给我们制造联动效果的WizardPage(也就是后一个WizardPage的内容是根据前面的WizardPage的操作动态生成的)造成了麻烦,不过这个问题也很好解决,这里(http://www.cnblogs.com/bjzhanghao/archive/2007/06/07/775314.html)已经给出了答案.即复写Wizard的createPageControls()方法,给一个空实现即可.
        不过还有另外一个问题没有解决,就是如果我现在一个Wizard中有a,b两个WizardPage,目前我停留在b WizardPage中,我现在点击back回到a WizardPage中,然后对内容做了修改,此次我希望再回到b WizardPage的时候,里面的内容也同时跟着发生改变,但是仅仅是复写Wizard的createPageControls()方法是无法实现,我们通过查看源代码,发现在org.eclipse.jface.wizard.WizardDialog.updateForPage(IWizardPage page)中:

java 代码
  1. private void updateForPage(IWizardPage page) {   
  2.  // ensure this page belongs to the current wizard   
  3.  if (wizard != page.getWizard()) {   
  4.    setWizard(page.getWizard());   
  5.   }   
  6.  // ensure that page control has been created   
  7.  // (this allows lazy page control creation)   
  8.  if (page.getControl() == null) {   
  9.      page.createControl(pageContainer);   
  10.      // the page is responsible for ensuring the created control is accessable   
  11.      // via getControl.   
  12.      Assert.isNotNull(page.getControl());   
  13.      // ensure the dialog is large enough for this page   
  14.      updateSize(page);   
  15.  }   
  16.  // make the new page visible   
  17.  IWizardPage oldPage = currentPage;   
  18.  currentPage = page;   
  19.  currentPage.setVisible(true);   
  20.  if (oldPage != null) {   
  21.    oldPage.setVisible(false);   
  22.   }   
  23.  // update the dialog controls   
  24.  update();   
  25. }   

 

          也就是在调用WizardPage的createControl()方法之前要做一个判断page.getControl() == null,因此我们只要将想办法在调转到某个WizardPage的时候,将其control设置为null就可以了.于是我们在a WizardPage中引起b WizardPage的内容发生改变的方法中添加如下代码:

java 代码

 

  1. // 对参数页必须重绘   
  2.  IWizardPage page = getNextPage();   
  3.  if (page.getControl() != null)   
  4.   page.dispose();   

          然后复写b WizardPage的dispose方法:

java 代码
  1. public void dispose() {   
  2.  super.dispose();   
  3.     
  4.  setControl(null);   
  5. }   

          这样我们就大功告成了.

原创粉丝点击