Eclipse 向導是指導用戶完成複雜操作的核心 UI 組件,廣泛應用於專案創建、文件導入導出、代碼生成等場景。標準向導由一系列固定順序的頁面組成,頁面間通過「下一步/上一步」線性跳轉。然而,現實業務邏輯往往包含條件分支、動態頁面增減等複雜流程,固定線性結構難以滿足需求。
本文基於 Eclipse 3.4.x 環境,深度剖析向導核心機制(頁面加載/註銷、校驗、執行流程、目標操作),並從動態頁面數量與樹狀拓撲結構兩個維度進行擴展,提供可復用的抽象基類實現,助力開發者快速構建複雜向導。
1. Wizard 構造函數創建向導實例
2. 創建 Shell 容器
3. addPages() - 重寫此方法添加頁面
4. WizardDialog.createPageContainer() - 創建頁面容器
5. IWizard.createPageControls() - 實例化所有頁面控件
6. WizardDialog.showStartingPage() - 顯示起始頁面
getNextPage(),默認按 addPages() 添加順序切換,需重寫以實現動態跳轉。performFinish() 執行業務邏輯。getPreviousPage() 和 performCancel()。用戶類型不同(普通/會員/VIP),訂票流程頁面動態增減:
頁面 B 和 D 根據用戶選擇動態顯示/隱藏,順序非固定。
使用 List<IWizardPage> pages 替代父類固定數組,提供動態增刪改查 API:
public abstract class DynamicPageWizard extends Wizard {
private List<IWizardPage> pages = new ArrayList<>();
// 在指定位置插入頁面
public boolean addPage(IWizardPage page, int location) { ... }
// 在指定頁面前插入
public boolean addPage(IWizardPage page, IWizardPage nextPage) { ... }
// 多種方式移除頁面
public void removePage(int number) { ... }
public void removePage(IWizardPage page) { ... }
public void removePage(String className) { ... }
// 必須重寫所有依賴 pages 變量的父類方法
public void addPages() { ... }
public IWizardPage getNextPage(IWizardPage page) { ... }
public IWizardPage getPreviousPage(IWizardPage page) { ... }
public IWizardPage getStartingPage() { ... }
public IWizardPage[] getPages() { ... }
public int getPageCount() { ... }
// ... 其他覆寫方法
}
開發者繼承此類,在業務邏輯中動態調用 addPage/removePage 即可實現頁面動態變化。
新增操作類型選擇:電影票預訂、申請會員、升級 VIP。形成兩級分支結構:
TreePageWizard:以 TreeWizardPage rootPage 為根節點,Set<TreeWizardPage> pages 存儲所有潛在頁面。核心邏輯圍繞樹節點增刪、分支選擇展開:
public abstract class TreePageWizard extends Wizard {
private TreeWizardPage rootPage;
private Set<TreeWizardPage> pages = new HashSet<>();
// 樹結構構建
public void addPage(IWizardPage page) { ... } // 遞歸添加子節點
public void addPage(TreeWizardPage page, TreeWizardPage previousPage) { ... }
public void removePage(TreeWizardPage page) { ... } // 遞歸移除子樹
// 導航委派給頁面節點
public IWizardPage getNextPage(IWizardPage page) { ... }
public IWizardPage getPreviousPage(IWizardPage page) { ... }
public IWizardPage getStartingPage() { ... return rootPage; }
// ... 其他覆寫方法
}
TreeWizardPage:擴展 WizardPage,維護 List<TreeWizardPage> children(子節點)與 TreeWizardPage nextPage(當前選擇的下一頁):
public class TreeWizardPage extends WizardPage {
private List<TreeWizardPage> children = new ArrayList<>();
private TreeWizardPage nextPage;
public void addChild(TreeWizardPage page) { ... }
public void removeChild(TreeWizardPage page) { ... }
public List<TreeWizardPage> getChildren() { ... }
public TreeWizardPage getNextPage() { return nextPage; }
public void setNextPage(TreeWizardPage nextPage) { ... } // 驗證屬於 children
public void setNextPage(String className) { ... } // 按類名查找設置
public void updateContainerButton() { getContainer().updateButtons(); }
}
開發者構建頁面樹、設置分支跳轉邏輯,即可實現複雜非線性流程。
兩種擴展模式解決不同複雜度需求:
DynamicPageWizard,動態操作 pages 列表。TreePageWizard 與 TreeWizardPage,構建頁面樹並控制分支選擇。完整示例代碼可參考附件 EclipseWizardExtension.zip,需自行補全文中省略的父類方法重寫代碼(因 JDK 版本差異與版權考量未直接提供)。