MIDP (Mobile Information Device Profile) 的 javax.microedition.lcdui 包是 J2ME 圖形用戶界面的核心。理解其類層次結構、Display 管理機制、Screen/Canvas 雙軌制、Command 事件模型、Ticker 跨組件復用,是構建穩健 MIDlet 應用的基石。本文系統梳理 LCDUI 架構圖譜與核心協協作流程。
java.lang.Object
└── javax.microedition.lcdui.Displayable (抽象基類)
├── javax.microedition.lcdui.Screen (高級 UI 抽象基類)
│ ├── javax.microedition.lcdui.Form (表單容器,包含 Item[])
│ ├── javax.microedition.lcdui.List (列表:單選/多選/隱式)
│ ├── javax.microedition.lcdui.TextBox (文本輸入框)
│ ├── javax.microedition.lcdui.Alert (警告/提示框,自帶聲音/超時)
│ └── (其他 Screen 子類)
│
└── javax.microedition.lcdui.Canvas (低級繪圖畫布,像素級控制)
└── javax.microedition.lcdui.game.GameCanvas (遊戲專用,雙緩衝/按鍵狀態)
| 類/介面 | 層級 | 核心能力 | 典型用途 |
|---|---|---|---|
| Display | 管理器 | 單例管理設備顯示、輸入設備;setCurrent() 切換畫面;獲取屏幕尺寸、顏色數、字體 | 唯一入口:Display.getDisplay(midlet) |
| Displayable | 抽象基類 | Command 管理 (add/remove);Ticker 管理 (set/get);標題 (set/getTitle);CommandListener 註冊 | Screen 和 Canvas 共同父類 |
| Screen | 高級 UI | 佈局由實現類管理;系統負責繪製;支持 Item/Command 高級交互 | Form/List/TextBox/Alert |
| Canvas | 低級繪圖 | paint(Graphics) 回調繪製;keyPressed/Released/Repeated 按鍵事件;pointer 觸控事件;全像素控制 | 遊戲、自定義圖表、特效、相機預覽 |
| Command | 動作封裝 | 類型 (OK/BACK/EXIT/SCREEN/ITEM/HELP/STOP/CANCEL);標籤;優先級 | 軟鍵/菜單項綁定業務邏輯 |
| CommandListener | 事件介面 | commandAction(Command, Displayable) 統一處理入口 | MIDlet 或內部類實現 |
| Ticker | 跑馬燈 | 單行滾動文本;可附加到任意 Displayable | 全局通告、狀態提示 |
Display.getDisplay(midlet).setCurrent(nextDisplayable)setCurrent(alert, nextScreen) (Alert 專用)Command 類型決定其在設備 UI 中的呈現位置與優先級:
| Command 類型 | 語義 | 典型位置 | 優先級建議 |
|---|---|---|---|
| OK | 確認、提交、選中 | 左軟鍵 (主操作) | 1 (最高) |
| BACK | 返回、取消、關閉 | 右軟鍵 (次操作) | 2 |
| EXIT | 退出應用 | 菜單中或右軟鍵長按 | 3 |
| SCREEN | 屏幕級操作 (菜單、設置) | 菜單中 | 4 |
| ITEM | 項目級操作 (編輯、刪除某項) | 針對特定 Item 顯示 | 5 |
| HELP | 幫助信息 | 菜單中 | 6 |
| STOP | 停止進程/播放/下載 | 左軟鍵 (視上下文) | 2 |
| CANCEL | 取消對話框/操作 | 右軟鍵 | 2 |
關鍵規則:同一 Displayable 上同類型 Command 只保留優先級最高 (數字最小) 的一個。
screen1.setTicker(ticker); screen2.setTicker(ticker);
public class MyMIDlet extends MIDlet implements CommandListener {
private Display display;
private Form mainForm, detailForm;
private List menuList;
protected void startApp() {
if (display == null) {
display = Display.getDisplay(this); // 1. 獲取 Display 單例
buildUI(); // 2. 構建 UI 組件樹
}
display.setCurrent(mainForm); // 3. 顯示入口畫面
}
private void buildUI() {
mainForm = new Form("主頁");
mainForm.append("歡迎使用");
mainForm.addCommand(new Command("進入", Command.OK, 1));
mainForm.addCommand(new Command("退出", Command.EXIT, 2));
mainForm.setCommandListener(this);
menuList = new List("功能菜單", Choice.IMPLICIT);
menuList.append("功能一", null);
menuList.append("功能二", null);
menuList.addCommand(new Command("返回", Command.BACK, 1));
menuList.setCommandListener(this);
}
public void commandAction(Command c, Displayable d) {
if (d == mainForm && c.getCommandType() == Command.OK) {
display.setCurrent(menuList); // 切換到菜單
} else if (d == menuList && c == List.SELECT_COMMAND) {
// 處理菜單選中
} else if (c.getCommandType() == Command.BACK) {
display.setCurrent(mainForm); // 返回主頁
} else if (c.getCommandType() == Command.EXIT) {
notifyDestroyed();
}
}
// pauseApp/destroyApp...
}
| 場景 | 選擇 | 理由 |
|---|---|---|
| 表單輸入、列表選擇、文本顯示、彈窗提示 | Screen 子類 (Form/List/TextBox/Alert) | 系統自動佈局、輸入法集成、滾動管理、無障礙支持 |
| 遊戲、繪圖板、自定義圖表、視頻播放、相機預覽、特殊動畫 | Canvas / GameCanvas | 像素級控制、幀率控制、觸控手勢、硬件加速 |
| 混合場景 | Screen 為主,關鍵頁面用 Canvas | 如:主流程 Form/List,遊戲關卡 Canvas |
LCDUI 採用Display 單例管理 + Displayable 雙軌制 (Screen 高級/Canvas 低級) + Command 類型化事件 + Ticker 共享的精簡架構。核心開發模式:構建組件樹 → 註冊 CommandListener → setCurrent 切換顯示 → 事件驅動業務 → 管理導航棧。雖然 J2ME 已成歷史,但此「單顯示管理器、類型化命令、畫面狀態自管」設計模式在 Android Activity/Fragment、iOS ViewController、Flutter Navigator、Web SPA Router 中均有清晰映射。