開發環境搭建:Eclipse + Sun WTK
- 安裝 JDK 1.4+(WTK 不含 JVM)。
- 安裝 Sun Java Wireless Toolkit (WTK) 2.2。
- 安裝 Eclipse 與 EclipseME 外掛(或使用 MTJ)。
- 配置 EclipseME:
Window → Preferences → J2ME 指向 WTK 安裝目錄。
建立首個 MIDlet 專案
File → New → Project → J2ME → J2ME Midlet Suite
- 專案名:
HelloWorld,目標平台選 MIDP 2.0 / CLDC 1.1。
- 右鍵專案 →
New → Other → J2ME → J2ME Midlet,類名 HelloWorld。
完整原始碼與註解
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloWorld extends MIDlet implements CommandListener {
private Form form;
private Command exitCmd;
private Display display;
public HelloWorld() {
form = new Form("Hello World");
form.append("Welcome to J2ME World!");
exitCmd = new Command("Exit", Command.EXIT, 1);
form.addCommand(exitCmd);
form.setCommandListener(this);
}
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(form); // 顯示表單
}
protected void pauseApp() {
// 釋放資源、暫停執行緒、存檔等
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
// 釋放所有資源、關閉連線、儲存狀態
}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) {
try {
destroyApp(false);
notifyDestroyed(); // 通知 AMS 銷毀 MIDlet
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
}
}
}
MIDlet 生命週期三狀態機制
每個 MIDlet 在應用管理軟體 (AMS) 控制下在三種狀態間流轉:
| 狀態 | 觸發方法 | 典型操作 |
| Paused (暫停) | 建構子執行完畢 / pauseApp() | 釋放非關鍵資源、暫停動畫執行緒、存檔 |
| Active (執行中) | startApp() | 取得 Display、顯示 UI、啟動遊戲迴圈、恢復網路連線 |
| Destroyed (銷毀) | destroyApp() → notifyDestroyed() | 釋放所有資源、關閉 RMS/網路、儲存最終狀態 |
狀態轉換流程圖
[AMS 建立實例] → Paused → startApp() → Active
↑ ↓
└── pauseApp() ←─┘
↓
destroyApp() → Destroyed → notifyDestroyed() → AMS 回收
核心 UI 類別速查
| 類別 | 繼承自 | 用途 |
Display | Object | 管理螢幕輸出與輸入,每個 MIDlet 單例,getDisplay(this) 取得 |
Displayable | Object | 可顯示物件基類 |
Screen | Displayable | 高層 UI 基類(含標題、命令、Ticker) |
Form | Screen | 容器,可放入 Item(StringItem, TextField, ChoiceGroup...) |
Command | Object | 抽象使用者動作(如 EXIT, OK, BACK),綁定 CommandListener |
Canvas | Displayable | 低層 UI,完全控制繪製(paint())、按鍵(keyPressed()) |
運行與除錯
- Eclipse 工具列
Run → Run As → Emulated J2ME Midlet 啟動模擬器。
- 模擬器選單
File → Exit 觸發 destroyApp()。
- 控制台輸出
System.out.println() 訊息,方便除錯。
常見新手錯誤避坑指南
- ❌ 忘記
form.setCommandListener(this) → 按鍵無反應。
- ❌
startApp() 重複執行邏輯 → 每次從 Paused 回 Active 都會重跑,需加旗標判斷。
- ❌
destroyApp() 未釋放資源 → 記憶體洩漏、RMS 損壞。
- ✅ 善用
Display.getDisplay(this).setCurrent() 切換畫面,而非 new 多個 Display。