首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaHelp 系統深度解析:跨平台在線幫助的構建與擴展

     編輯:Java 相關知識

前言:純 Java 的幫助標準

JavaHelp (JH) 是 Sun 定義的純 Java 在線幫助系統規範 (JSR 197),基於 Swing (JFC) 實現,跨平台、可嵌入 Applet/Application、支持動態更新、合並多模塊幫助集。雖然 Web 應用主流轉向瀏覽器端幫助中心,但在桌面端 (Swing/JavaFX/Eclipse RCP)、嵌入式設備、離線環境仍具不可替代價值。

核心優勢

  • 跨平台零安裝:單 JAR (`jhall.jar` + `jh.jar` + `jhbasic.jar` + `jhsearch.jar`) 即可運行,無需原生庫。
  • 嵌入式靈活:內嵌應用窗口 (`CSH.setHelpOnButton`)、獨立窗口 (`HelpBroker.show()`)、上下文敏感幫助 (F1/Help 按鈕/ToolTip)。
  • 導航三件套:TOC (層次目錄)、Index (關鍵字索引)、Full-text Search (Lucene 驅動),支持多幫助集合並 (TOC/Index/Search 數據庫合並)。
  • 內容分離:HTML 3.2+ 內容文件、XML 元數據 (Helpset `.hs`、Map `.jhm`、TOC `.xml`、Index `.xml`)、打包為單 JAR 分發。
  • 擴展點:輕量級組件 (Lightweight Component) 嵌入 HTML (`` 標籤)、自定義導航器、搜索引擎替換、合並 API (`HelpSet.merge`)。

    幫助集結構

    
    helpset.hs (Helpset 入口)
    ├── map.jhm (Map 文件: TopicID → URL)
    ├── toc.xml (TOC 文件: 樹結構, target=TopicID)
    ├── index.xml (Index 文件: 關鍵字 → TopicID 列表)
    ├── search/db (搜索索引, 由 jhindexer 生成)
    └── content/ (HTML 內容文件目錄)
        ├── intro.html
        ├── task/
        │   ├── create.html
        │   └── edit.html
        └── ref/
            └── api.html
    

    關鍵文件示例

    helpset.hs (Helpset 定義)

    
    <?xml version="1.0" encoding="UTF-8"?>
    <helpset version="2.0">
      <title>My Application Help</title>
      <maps>
        <mapref location="map.jhm"/>
      </maps>
      <view name="TOC">
        <label>目錄</label>
        <type>javax.help.TOCView</type>
        <data>toc.xml</data>
      </view>
      <view name="Index">
        <label>索引</label>
        <type>javax.help.IndexView</type>
        <data>index.xml</data>
      </view>
      <view name="Search">
        <label>搜索</label>
        <type>javax.help.SearchView</type>
        <data>search</data> <!-- 索引目錄 -->
      </view>
      <view name="Favorites"> <!-- 自定義視圖 -->
        <label>收藏</label>
        <type>com.myapp.FavoritesView</type>
        <data>fav.xml</data>
      </view>
    </helpset>
    

    map.jhm (ID 映射)

    
    <?xml version="1.0" encoding="UTF-8"?>
    <map version="2.0">
      <mapID target="intro" url="content/intro.html"/>
      <mapID target="task.create" url="content/task/create.html"/>
      <mapID target="task.edit" url="content/task/edit.html"/>
      <mapID target="ref.api" url="content/ref/api.html"/>
    </map>
    

    toc.xml (目錄結構)

    
    <?xml version="1.0" encoding="UTF-8"?>
    <toc version="2.0">
      <tocitem target="intro" text="快速入門"/>
      <tocitem text="任務指南">
        <tocitem target="task.create" text="創建對象"/>
        <tocitem target="task.edit" text="編輯對象"/>
      </tocitem>
      <tocitem target="ref.api" text="API 參考"/>
    </toc>
    

    應用集成代碼

    
    import javax.help.*;
    import java.net.URL;
    import java.awt.event.*;
    
    public class HelpIntegration {
        private HelpSet hs;
        private HelpBroker hb;
    
        public void initHelp() throws Exception {
            // 1. 載入 Helpset (從 classpath/JAR/文件系統)
            URL hsURL = HelpSet.findHelpSet(getClass(), "helpset.hs"); // 也支持 File/HTTP URL
            hs = new HelpSet(getClass().getClassLoader(), hsURL);
            hb = hs.createHelpBroker();
    
            // 2. 上下文敏感幫助綁定 (組件級)
            CSH.setHelpOnButton(helpButton, "task.create", hs); // 按鈕
            CSH.setHelpOnButton(menuItem, "task.edit", hs);     // 菜單項
            CSH.setHelpKeyString(textField, "ref.api", hs);     // 文本框 F1
            CSH.setHelpIDString(dialog, "intro", hs);           // 對話框
    
            // 3. 獨立幫助窗口動作
            Action showHelp = new AbstractAction("幫助文檔") {
                public void actionPerformed(ActionEvent e) {
                    hb.setCurrentID("intro"); // 默認主題
                    hb.setSize(800, 600);
                    hb.setLocationRelativeTo(mainFrame);
                    hb.setDisplayed(true);
                }
            };
            helpMenu.add(showHelp);
            toolBar.add(showHelp);
    
            // 4. 動態合並外部幫助集 (插件化)
            // URL extHSURL = new URL("https://updates.myapp.com/plugins/extra.hs");
            // HelpSet extHS = new HelpSet(classLoader, extHSURL);
            // hs.merge(extHS); // TOC/Index/Search 自動合並
        }
    }
    

    輕量級組件嵌入 HTML

    在 HTML 內容中嵌入 Swing 組件 (彈出窗口、動畫、計算器、圖表):

    
    <object classid="java:javax.help.Popup"
            codebase="."
            width="200" height="150">
      <param name="content" value="content/glossary_def.html"/>
      <param name="viewerActivator" value="link"/>
      <param name="text" value="點擊查看術語定義"/>
      <param name="windowType" value="popup"/>
    </object>
    

    自定義組件需實現 `javax.help.impl.ViewAwareComponent`,接收 `setViewData(ViewData)` 獲取上下文信息。

    作者工具鏈

    版本演進與兼容性

    • JavaHelp 1.1.3:JDK 1.1+ 支持、最終穩定版、廣泛用於舊系統。
    • JavaHelp 2.0:J2SE 1.2.2+、合並 API、改進搜索、新視圖類型、Unicode 完善。現代項目首選。
    • JavaHelp 2.0_02/03:Bug 修復、性能優化、最新維護版 (2010 年後社區維護)。

    現代替代方案對比

    工具特征授權
    Helen (Software7)可視化編輯、項目管理、批量導入、多語言商業
    HelpBreeze (SolutionSoft)Word/FrameMaker 導入、模板驅動、腳本自動化商業
    JavaHelp Author (Pivotonic)基於 Eclipse、XML 編輯、預覽、構建商業
    開源替代DocBook + XSLT → JavaHelp、AsciiDoc + 自定義後端、手寫 XML + Ant 構建腳本免費

    總結

    JavaHelp 是桌面端 Java 應用專業幫助系統的「標準答案」。掌握 Helpset/Map/TOC/Index/Search 五大元數據結構、上下文敏感綁定 API、合並機制、輕量組件擴展,即可構建媲美商業軟件的幫助體驗。對於現代 Web 應用,建議採用「桌面端用 JavaHelp、Web 端用 Docusaurus/VitePress、統一內容源 (Markdown/AsciiDoc) → 多渠道發布」的混合策略。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved
    方案適用場景優勢劣勢
    JavaHelpSwing/JavaFX 桌面、嵌入式、離線、插件化幫助純 Java、標準化、嵌入式、合並、輕量組件UI 風格老舊、HTML 支持有限 (無 HTML5/CSS3/JS)、移動端不適用
    Web Help CenterWeb 應用、SaaS、移動端、多語言、SEO現代技術棧、響應式、分析統計、易維護需網絡、需獨立部署、桌面應用集成需內嵌瀏覽器
    Eclipse Help (Infocenter)Eclipse RCP/插件平台原生集成、TOC/索引/搜索、動態插件綁定 Equinox、非 Eclipse 項目引入重
    Markdown + 靜態站點 (Docusaurus/VitePress/GitBook)文檔站點、API 參考、開發者門戶寫作體驗佳、版本控制、CI/CD 部署、主題豐富非嵌入式、無上下文敏感、無合並機制