本文以一個經典的「指法練習 Applet 遊戲」為載體,完整示範 JBuilder 2005 開發 Applet 的全流程,涵蓋 GUI 設計、動畫繪製、音效播放、事件處理、多執行緒、I/O 存取、Applet 打包、安全沙箱突破 (數位簽名)、JRE 插件自動安裝等核心知識點。
Canvas 畫布,分 10 欄,字母隨機下落。BorderLayout 整體,畫布置中,控制面板置東,內部採 GridLayout(9,1)。TypeTrainApplet (繼承 JApplet):主類別,負責 UI 建構、事件響應、統計更新。DropCharThread (內部類別,繼承 Thread):單一字母下落執行緒,負責繪製、移動、碰撞檢測、清除。GenerateDropThread (內部類別,繼承 Thread):產生器執行緒,定時建立 DropCharThread 實例。關鍵設計點:
totalCount 等) 使用 volatile 保證多執行緒可見性。<param> 傳入,無需改代碼即可調整難度。Graphics.setXORMode() 實現字母移動無殘影。canvas 物件,透過 wait()/notifyAll() 協調。DropCharThread)流程:繪製字母 → 循環檢測 (未擊中、未到底、遊戲運行中) → 暫停檢查 (wait) → 清除舊位置 → 更新座標 → 繪製新位置 → 睡眠 → 循環。循環結束後統計結果、播放擊中音效、更新介面。
使用 Applet.getAudioClip() 載入 hit.wav,擊中時呼叫 play(),顯著提升遊戲手感。
GenerateDropThread)定時 (可配置) 產生隨機字母 (a-z) 與隨機欄位 (1-10),啟動 DropCharThread。同樣支援暫停同步。
覆寫 keyPressed,過濾非字元鍵,將按鍵字元存入 pressKeyChar,供下落執行緒檢測碰撞。
D:\result.txt,未簽名時被沙箱攔截 (SecurityException)。覆寫 start()/stop(),設定 isClose 標誌,下落執行緒定期檢查,避免瀏覽器關閉時存取已銷毀的 Graphics 導致 NullPointerException。
keytool -genkey -alias myAlias -keyalg RSA -keystore myKeystore -validity 3650,設定金鑰庫密碼與金鑰密碼。File → New → Archive → Applet JAR,勾選壓縮,包含所有 game/*.class 及資源檔 (圖片、音效)。Digitally sign this archive,指定金鑰庫、別名、密碼、類型 (JKS)。<applet> 標籤加入 archive="game.JAR",將 HTML 放至 JAR 同目錄。使用 JDK 附帶 HtmlConverter.exe 轉換 HTML,生成 <object> (IE) 與 <embed> (Navigator) 標籤,指定 codebase 指向 Sun JRE 下載頁。若客戶端無 JRE 或版本過低,將自動下載安裝指定版本 (如 1.5.0),確保 Applet 在標準環境運行。企業內網部署可將 CAB 檔與 XML 配置置於自有伺服器,修改路徑實現離線安裝。
這個看似簡單的遊戲實則串聯了 Applet 開發的完整知識鏈:從 UI 設計、多執行緒動畫、事件驅動、資源管理,到安全模型突破與跨瀏覽器部署。數位簽名解決了「外來客」不被信任的困境,HtmlConverter 解決了「環境不一致」的痛點。掌握這套流程,即掌握了 Java 客戶端應用分發的核心技術。