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

J2ME 核心功能實戰 (一):高階 UI 元件、MIDlet 結構與 RMS 通訊錄完整範例

     編輯:J2ME

J2ME 實戰入門:從最簡單的 MIDlet 架構出發,掌握高階 UI 元件 (TextBox, List, Command) 與 RMS 持久化儲存,完整建構一個通訊錄應用。

一、最小 MIDlet 骨架


public class MIDlet1 extends MIDlet implements CommandListener {
    private Display display;
    private TextBox textBox;
    private Command cmdExit;

    public MIDlet1() {
        display = Display.getDisplay(this);
        cmdExit = new Command("Exit", Command.SCREEN, 1);
        textBox = new TextBox("MIDlet 1", "Welcome", 50, 0);
        textBox.addCommand(cmdExit);
        textBox.setCommandListener(this);
    }

    protected void startApp() { display.setCurrent(textBox); }
    protected void pauseApp() {}
    protected void destroyApp(boolean u) {}

    public void commandAction(Command c, Displayable d) {
        if (c == cmdExit) { destroyApp(false); notifyDestroyed(); }
    }
}

二、高階 UI 核心元件速覽

元件用途關鍵方法
Display螢幕管理單例getDisplay(midlet), setCurrent()
TextBox多行文字輸入/顯示setString(), getString(), setConstraints()
List選單/清單 (IMPLICIT/EXCLUSIVE/MULTIPLE)append(), getSelectedIndex()
Form容器,可放入 Itemappend(Item), setItemStateListener()
Command軟鍵/選單動作new Command(label, type, priority)
Alert暫時性提示/確認對話框setTimeout(), setType()

三、RMS (Record Management System) 核心操作

1. 開啟/建立 RecordStore


RecordStore rs = RecordStore.openRecordStore("TestRecordSet", true); // true=不存在則建立

2. 新增記錄


ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF("資料內容");
byte[] data = bos.toByteArray();
int recordId = rs.addRecord(data, 0, data.length); // 回傳記錄 ID (1-based)

3. 讀取/遍歷 (RecordEnumeration)


RecordEnumeration re = rs.enumerateRecords(null, null, false);
while (re.hasNextElement()) {
    byte[] rec = re.nextRecord();
    // 解析 byte[] → String/物件
}

四、完整通訊錄實作:雙類別分離架構

AddressDB.java — 資料存取層


public class AddressDB {
    private static RecordStore rs;
    public AddressDB() { /* openRecordStore */ }
    public void addAddress(String name, String addr) { /* writeUTF + addRecord */ }
    public static String getName(int index) { /* enumerateRecords + 解析 */ }
    public static String getAddress(int index) { /* 同上 */ }
    public static int recordCount() { return rs.getNumRecords(); }
}

AddressBookMIDlet.java — 介面邏輯層


public class AddressBookMIDlet extends MIDlet implements CommandListener {
    private Display display;
    private List mainList;
    private TextBox detailBox;
    private AddressDB db;
    private Command cmdExit, cmdBack;

    public AddressBookMIDlet() {
        db = new AddressDB();
        // 預設測試資料
        db.addAddress("Bill Gates", "123 Elm Street");
        db.addAddress("George Bush", "742 Avenue B");
        // ...
    }

    protected void startApp() {
        display = Display.getDisplay(this);
        mainList = new List("Addresses", List.IMPLICIT);
        for (int i=1; i<=db.recordCount(); i++) {
            mainList.append(db.getName(i), null);
        }
        mainList.addCommand(cmdExit);
        mainList.setCommandListener(this);
        display.setCurrent(mainList);
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmdExit) { destroyApp(true); }
        else if (c == cmdBack) { display.setCurrent(mainList); }
        else { // List 選項被選取
            int idx = ((List)display.getCurrent()).getSelectedIndex() + 1;
            String info = db.getName(idx) + ", " + db.getAddress(idx);
            detailBox = new TextBox("Address", info, 255, TextField.ANY);
            detailBox.addCommand(cmdBack);
            detailBox.setCommandListener(this);
            display.setCurrent(detailBox);
        }
    }
    // pauseApp/destroyApp 略
}

五、關鍵設計模式:DAO 分離

  • AddressDB 封裝所有 RMS 細節 (開啟存儲、UTF 編碼、記錄解析)
  • MIDlet 只關心 UI 流程與資料呈現
  • 優點:測試容易、可替換儲存後端 (如改為網路)、符合 MVC 精神

六、下一步:網路化通訊錄

將預設資料移至伺服器端文字檔,MIDlet 啟動時透過 HttpConnection 下載解析,詳見「J2ME 核心功能實戰 (二)」。

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