首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

Eclipse 引导机制扩展 - 实现可定制的向导

2014-01-08 
Eclipse 向导机制扩展 -- 实现可定制的向导在 Eclipse 中,向导必须实现接口 org.eclipse.jface.wizard.IWi

Eclipse 向导机制扩展 -- 实现可定制的向导

在 Eclipse 中,向导必须实现接口 org.eclipse.jface.wizard.IWizard,Eclipse 提供的 org.eclipse.jface.wizard.Wizard 是 IWizard 的一个抽象实现。向导页必须实现接口 org.eclipse.jface.wizard.IWizardPage,org.eclipse.jface.wizard.WizardPage 是 IWizardPage 的一个抽象实现。用户如果想使用 Eclipse 提供的框架创建自己的向导,那么向导和向导页需要分别继承 Wizard 类和 WizardPage 类并重写相应方法。?
创建一个 Eclipse 向导后台发生的操作顺序大致如下,在这个过程中,我们需要重写第一步中向导的构造函数,以及第三步中添加向导页操作。?
1. 使用 IWizard 子类的构造函数创建 Eclipse 向导;?
2. 创建向导所在的 Shell;?
3. 添加向导页:addPages(),重写该方法给向导插入的向导页;?
4. 创建向导页容器:WizardDialog.createPageContainer(Composite parent);?
5. 创建每个向导页对应的 Control:IWizard.createPageControls(Composite pageContainer)。Eclipse 调用它来实例化所有的向导页面。重写它给向导添加持续可视的窗体小部件;?
6. 显示起始向导页:调用 WizardDialog.showStartingPage():重写该方法以获取向导第一个页面。

向导页定制

下面我们来看一下向导页的定制,向导页扩展了 WizardPage 类。开发人员为了定制自己的页面,必须重写下面一些方法:

    向导页编号标题内容

    对于普通用户:在向导页 A 中选择普通用户类型,然后进入向导页 B,填写其基本信息,然后进入向导页 C 进行选票并结束。 见下图。

    图 3. 普通用户电影订票流程

    Eclipse 引导机制扩展 - 实现可定制的向导

    对于会员或者 VIP 会员用户:在向导页 A 中选择会员用户或者 VIP 会员,跳过向导页 B,直接进入向导页 C,选票结束之后,进入向导页 D,查看其历史纪录。见下图。

    图 4. 会员用户以及 VIP 会员用户电影订票流程

    Eclipse 引导机制扩展 - 实现可定制的向导

    为了实现向导页的动态增加或者减少功能,本文提供了一个动态向导的抽象类 DynamicPageWizard,供广大开发人员使用。用户使用时,只需要继承该抽象类,并重写向导页初始化,增加,修改,以及删除等方法,便可以方便地实现动态向导。该向导类继承了类 org.eclipse.jface.wizard.Wizard,在原 Wizard 的基础上进行扩展,使用变量 List<IWizardPage> pages 来存储向导中的所有向导页,类中所有对向导页的操作都是基于该变量进行,包括向导页的创建、注销、动态增加以及删除。详细的内容见下面清单。由于使用 pages 变量覆盖了原 org.eclipse.jface.wizard.Wizard 中的 pages 变量,因而父类方法中基于该变量的所有方法都需要重写,在下表中省略号部分是重写的代码,读者可以根据自己的 JDK 版本以及扩展需要,将内容补上。

    清单 1. 动态页数向导父类 DynamicPageWizard向导页编号标题内容

    首先在向导页 A 中选择操作类型,如果是电影票预订操作,则进入向导页 B,如果是申请成为会员,则进入向导页 C,如果是升级为 VIP 会员,则进入向导页 D,这是第一次分支;当用户选择电影票预订并进入向导页 B 之后,用户再选择其用户类型,这是该向导的第二次分支,如果用户是普通用户,则进入向导页 E 填写普通用户基本信息,然后进入向导页 F 进行选票并结束;如果用户是会员或者 VIP 会员,则直接进入向导页 F,选票结束之后,进入向导页 G,查看其历史纪录。

    普通用户预定电影票操作:首先在向导页 A 中,选择电影票预订,进入订票分支;然后在向导页 B 中,选择普通用户,进入普通用户订票分支。见下图。

    图 6. 普通用户电影订票流程

    Eclipse 引导机制扩展 - 实现可定制的向导

    会员用户预定电影票操作:首先在向导页 A 中,选择电影票预订,进入订票分支;然后在向导页 B 中,选择会员用户,输入会员用户名和密码,进入会员用户订票分支。见下图。

    图 7. 会员用户电影订票流程

    Eclipse 引导机制扩展 - 实现可定制的向导

    申请成为会员操作:在向导页 A 中,选择申请成为会员,进入申请成为会员分支。见下图。

    图 8. 申请成为会员流程

    Eclipse 引导机制扩展 - 实现可定制的向导

    为了实现树状拓扑结构,文章提供了一个树状向导的抽象类 TreePageWizard,以及向导页类 TreeWizardPage 供开发人员使用。用户使用时,只需要将其向导类继承 TreePageWizard,向导页类继承 TreeWizardPage,重写这两个类中相应的方法,便可以方便地实现树状拓扑结构向导。

    向导类 TreePageWizard 继承自类 org.eclipse.jface.wizard.Wizard,在原 Wizard 的基础上进行扩展,使用变量 TreeWizardPage rootPage 来存储树结构的根节点对应的向导页,树结构的根节点即是该向导的起始页。使用变量 Set<TreeWizardPage> pages 来存储树结构中的所有向导页。类中所有操作都是围绕这两个变量进行,包括树结构中节点的添加、删除、树结构分支的选择等等。和动态向导不同的是,pages 里面保存的向导页是向导中所有可能的页面,而 DynamicPageWizard 中存储的是当前向导中的页面,并且 pages 的类型是 Set<TreeWizardPage>,DynamicPageWizard 中类型是 List<IWizardPage>,详细的内容见下面清单。同样,由于 pages 变量覆盖了原 org.eclipse.jface.wizard.Wizard 中的 pages 变量,之前基于该变量的所有方法都需要重写,读者可以根据不同的 JDK 版本以及自己的需要,将必须重写部分内容补上。

    清单 2. 树状拓扑向导父类 TreePageWizard
    public class TreeWizardPage extends WizardPage {    /**    * 当前向导页所有可能的下一个向导页   */    private List <TreeWizardPage> children = new ArrayList <TreeWizardPage>();    /**    * 当前向导的下一个向导页   */    private TreeWizardPage nextPage = null;    /**    * 构造函数   *    * @param pageName    */    protected TreeWizardPage(String pageName) {      super(pageName);    }    /**    * 构造函数   *    * @param pageName    * @param title    * @param titleImage    */    protected TreeWizardPage(String pageName, String title,          ImageDescriptor titleImage) {      super(pageName, title, titleImage);    }    /*    * (non-Javadoc)    *    * @see    * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets    * .Composite)    */    public void createControl(Composite parent) {    }    /*    * (non-Javadoc)    *    * @see org.eclipse.jface.wizard.WizardPage#getNextPage()    */    public TreeWizardPage getNextPage() {      return nextPage;    }    /**    * 设置该向导的下一页   *    * @param nextPage    *            the nextPage to set    */    public void setNextPage(TreeWizardPage nextPage) {      for (int i = 0; i  < children.size(); i++) {        if (children.get(i) == nextPage) {          this.nextPage = nextPage;          updateContainerButton();        }      }      this.nextPage = null;    }    /**    * 设置该向导的下一页   *    * @param className    */    public void setNextPage(String className) {     int number = -1;      for (int i = 0; i  < children.size(); i++) {        if (children.get(i).getClass().getCanonicalName().equalsIgnoreCase(className))          number = i;      }      if (number != -1) {        this.nextPage = children.get(number);        updateContainerButton();      } else        this.nextPage = null;    }    /**    * 添加可能的下一个向导页   *    * @param page    */    public void addChild(TreeWizardPage page) {      if (page != null) {        children.add(page);        page.setPreviousPage(this);      }    }    /**    * 删除可能的下一个向导页   *    * @param page    */    public void removeChild(TreeWizardPage page) {      if (page != null) {        if (children.contains(page))          children.remove(page);      }    }    /**    * 获取所有可能的下一个向导页   *    * @return the children    */    public List <TreeWizardPage> getChildren() {      return children;    }    /**    * 更新向导中的按钮,包括上一步按钮,下一步按钮,结束按钮以及取消按钮   */    public void updateContainerButton() {      getContainer().updateButtons();    }  }

    关于上文中两个例子的具体实现,读者可以在附件 EclipseWizardExtension.zip 中找到,考虑到不同 JDK 以及版权的问题,并没有将两种向导的父类 DynamicPageWizard 和 TreePageWizard 放在附件中,读者仅需要在 org.eclipse.expand.wizard 包中重建这两个类,并把文中省略部分补全即可。

    小结

    本文对 Eclipse 向导机制进行了两个方面的扩展,在原有 Eclipse 向导的基础上,扩展实现了一种动态页数的向导,以及一种具有树状拓扑结构的向导。动态页数向导支持在向导中任意添加或者删除新的向导页,实现时向导类需要继承 DynamicPageWizard 类,并重写动态添加或者删除向导页方法;而树状拓扑结构使得向导根据用户不同选择,其流程可以实现分支,树状向导需要继承 TreePageWizard 类,向导页需要继承 TreeWizardPage 类,并分别重写父类中的相应方法。基于这两种扩展,用户可以快速编写复杂的 Eclipse 向导实现,满足实际需要。

    声明:本文仅代表作者个人观点,不代表 IBM 公司之观点。

热点排行