記錄 J2ME 入門學習全過程:軟體安裝、WTK 專案建立、Hello World 實作、MIDlet 生命週期、系統屬性查詢、記憶體監控、List/Form/Canvas 核心 UI 元件用法,含中文顯示測試與模擬器選擇建議。
WTK_HOME/ ├── apps/ # 專案與範例 │ ├── fancy/ # 自建專案 │ │ ├── src/ # 原始碼 (編譯輸入) │ │ │ └── fancy/test/HelloWorld.java │ │ ├── classes/ # 編譯輸出 .class │ │ ├── bin/ # 打包輸出 .jar/.jad │ │ ├── res/ # 資源檔 (圖片等) │ │ ├── lib/ # 空 │ │ ├── tmpclasses/ # classes 鏡像 │ │ └── tmplib/ # lib 鏡像 │ ├── UIDemo/ # UI 範例 │ └── example/ # 圖形範例 ├── bin/ # WTK 執行檔 ├── docs/ # 文件 ├── lib/ # MIDP API └── wtklib/ # WTK 內部類庫
建立專案:KToolbar → New Project → Project Name: fancy, MIDlet Class: fancy.test.HelloWorld → 確定。
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorld extends MIDlet implements CommandListener {
private Display display;
private Form form;
private Command exitCmd = new Command("Exit", Command.EXIT, 1);
public HelloWorld() {
display = Display.getDisplay(this); // 建構子取得 Display
}
public void startApp() {
form = new Form("Hello World");
form.append("Hello World!\n");
form.addCommand(exitCmd);
form.setCommandListener(this);
display.setCurrent(form);
}
public void pauseApp() { display.setCurrent(null); form = null; }
public void destroyApp(boolean u) {}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) { destroyApp(false); notifyDestroyed(); }
}
}
MIDlet、實作 CommandListener。Display.getDisplay(this) 取得顯示管理器。startApp() 建立 UI、註冊命令、設定監聽、顯示。commandAction 統一處理命令 (Exit → 銷毀退出)。startApp → 事件迴圈 → commandAction → pauseApp → destroyApp。javax.microedition.lcdui:UI (Command, Form, Canvas, List, Alert...)javax.microedition.rms:記錄管理 (持久化)javax.microedition.midlet:MIDlet 生命週期javax.microedition.io:網路 (HttpConnection, SocketConnection...)java.io.*, java.lang.*, java.util.*:核心精簡包模擬器通常正常,實機可能亂碼 (編碼不匹配)。測試程式 Poem.java 在 Form append 多行詩詞驗證。
System.getProperty("microedition.configuration"); // CLDC-1.0
System.getProperty("microedition.profiles"); // MIDP-1.0
System.getProperty("microedition.platform"); // 裝置型號
System.getProperty("microedition.locale"); // zh-CN
System.getProperty("microedition.encoding"); // GBK
// 核心 java.* 屬性 (version, vendor 等) 在 J2ME 中多為 null
注意:J2ME System 類無 getProperties() 方法,多數標準屬性不支援。
Runtime rt = Runtime.getRuntime();
long total = rt.totalMemory(); // 總堆疊
long free = rt.freeMemory(); // 可用
// J2ME Runtime 無 exec() 等執行外部程式功能
List list = new List("Choose URL", Choice.EXCLUSIVE); // 單選
list.append("www.pku.edu.cn", null); // 第二參數為 Image 圖示
list.append("www.yahoo.com", null);
list.addCommand(exitCmd);
list.setCommandListener(this);
display.setCurrent(list);
Choice.EXCLUSIVE:單選 (圓形單選鈕)。Choice.MULTIPLE:多選 (方形核取方塊)。append(String, Image):圖示可為 null。WTK 內建 6 種。推薦 RIM Java Handle (螢幕大、視覺佳),但開發時須牢記實機螢幕尺寸差異。KToolbar 可設定預設模擬器 (Default Device Selection)。
每新增一個 MIDlet 類別,需在 KToolbar Settings → MIDlets 面板 Add:
MIDlet名稱 | 圖示png | 完整類別名 (如 fancy.test.Poem) → OK → 重新 Build/Run。