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

MIDP 高級 UI 組件深度解析(一):LCDUI 架構與 Display 管理核心

     編輯:Java 相關知識

MIDP (Mobile Information Device Profile) 的 javax.microedition.lcdui 包是 J2ME 圖形用戶界面的核心。理解其類層次結構、Display 管理機制、Screen/Canvas 雙軌制、Command 事件模型、Ticker 跨組件復用,是構建穩健 MIDlet 應用的基石。本文系統梳理 LCDUI 架構圖譜與核心協協作流程。

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 管理機制:單一當前顯示原則

  • **同一時刻,設備屏幕上只能顯示一個 Displayable (Screen 或 Canvas 實例)**
  • 切換顯示:Display.getDisplay(midlet).setCurrent(nextDisplayable)
  • 切換時:前一 Displayable 隱藏 (不銷毀),新 Displayable 顯示並獲得焦點
  • 開發者**必須自行管理畫面棧/導航狀態** (如返回上一頁需保存引用)
  • 可選帶返回目標:setCurrent(alert, nextScreen) (Alert 專用)

Command 事件模型:類型驅動佈局

Command 類型決定其在設備 UI 中的呈現位置與優先級:

Command 類型語義典型位置優先級建議
OK確認、提交、選中左軟鍵 (主操作)1 (最高)
BACK返回、取消、關閉右軟鍵 (次操作)2
EXIT退出應用菜單中或右軟鍵長按3
SCREEN屏幕級操作 (菜單、設置)菜單中4
ITEM項目級操作 (編輯、刪除某項)針對特定 Item 顯示5
HELP幫助信息菜單中6
STOP停止進程/播放/下載左軟鍵 (視上下文)2
CANCEL取消對話框/操作右軟鍵2

關鍵規則:同一 Displayable 上同類型 Command 只保留優先級最高 (數字最小) 的一個。

Ticker 跨組件復用機制

  • 單個 Ticker 實例可同時設置給多個 Displayable:screen1.setTicker(ticker); screen2.setTicker(ticker);
  • 系統在顯示該 Displayable 時自動啟動滾動,切走時暫停
  • 適合全局公告、網絡狀態、未讀消息數等跨頁面提示

典型 MIDlet 啟動與畫面切換流程


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 vs Canvas 選型決策

場景選擇理由
表單輸入、列表選擇、文本顯示、彈窗提示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 中均有清晰映射。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved