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

NetBeans IDE 4.0 開發 J2ME 貨幣轉換器完整教程

     編輯:J2ME

前言:從樣例到自寫,一小時掌握 MIDP 開發全流程

NetBeans Mobility Pack 4.0 提供可視化向導、模擬器管理、多設備配置、源碼編輯器輔助,讓 J2ME 開發效率大幅提升。本教程分兩階段:先跑通內置樣例,再從零手寫完整應用,涵蓋項目創建、MIDlet/表單/列表編碼、RMS 持久化、多模擬器並行測試。

一、 環境準備

  • JDK 1.4.2+
  • NetBeans IDE 4.0
  • NetBeans Mobility Pack 4.0 (含 WTK 2.2)

二、 階段一:安裝並測試樣例項目

  1. File → New Project → Samples → Mobile → Currency Converter。
  2. 接受默認項目名/位置,平台選 J2ME Wireless Toolkit,設備 DefaultColorPhone。
  3. Run → Run Main Project,模擬器啟動,點「Launch」→ 選幣種 → 輸入金額 → 看轉換結果 → 「Exit」退出。
  4. 切換設備:項目屬性 → Platform → Device 選 QwertyDevice → 再次運行,驗證鍵盤佈局適配。

三、 階段二:從零創建 NewCurrencyConverter

1. 創建 Mobile Application 項目

  • 項目名 NewCurrencyConverter,勾選 Set as Main Project。
  • 平台默認(WTK 2.2 / DefaultColorPhone)。

2. 編寫 ConverterMIDlet.java (核心控制器)

package myconverter;

import java.io.*;
import javax.microedition.rms.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class ConverterMIDlet extends MIDlet {
    private static final String STORE_NAME = "ConverterData";
    private RecordStore store;

    // 幣種顯示名
    public String[] currencies = {"US $", "Yen ¥", "Euro €"};
    // 用戶勾選的幣種
    public boolean[] selected = {true, true, true};
    // 匯率表:rates[from][to] = 從 from 到 to 的倍率 * 1_000_000
    public long[][] rates = {
        {1_000_000, 117_580_000, 911_079},
        {8_504, 1_000_000, 7_749},
        {1_097_600, 129_056_000, 1_000_000}
    };

    // 生命週期
    public void startApp() {
        loadSettings();
        notifySettingsChanged(); // 顯示主表單
    }

    public void destroyApp(boolean unconditional) {
        saveSettings();
        notifyDestroyed();
    }

    public void pauseApp() {}

    // 持久化
    private void loadSettings() {
        try {
            store = RecordStore.openRecordStore(STORE_NAME, true);
            if (store.getNumRecords() > 0) {
                DataInputStream in = new DataInputStream(
                    new ByteArrayInputStream(store.getRecord(1)));
                int size = in.readInt();
                currencies = new String[size];
                selected = new boolean[size];
                rates = new long[size][];
                for (int i=0; i 0) store.setRecord(1, data, 0, data.length);
            else store.addRecord(data, 0, data.length);
        } catch (Exception e) { e.printStackTrace(); }
    }

    // 導航
    public void showSettings() { Display.getDisplay(this).setCurrent(new CurrenciesSelector(this)); }
    public void notifySettingsChanged() { Display.getDisplay(this).setCurrent(new Converter(this)); }

    // 業務:轉換
    public long convert(long value, int fromIdx, int toIdx) {
        return (value * rates[fromIdx][toIdx]) / 1_000_000;
    }
}

3. 編寫 Converter.java (主表單,輸入/顯示/轉換)

package myconverter;

import javax.microedition.lcdui.*;

public class Converter extends Form implements CommandListener, ItemStateListener {
    private ConverterMIDlet midlet;
    private int[] translate; // 映射:表單索引 → currencies 索引

    public Converter(ConverterMIDlet midlet) {
        super("Currency Converter");
        this.midlet = midlet;
        translate = new int[midlet.currencies.length];
        int idx = 0;
        for (int i=0; i

4. 編寫 CurrenciesSelector.java (幣種選擇列表)

package myconverter;

import javax.microedition.lcdui.*;

public class CurrenciesSelector extends List implements CommandListener {
    private ConverterMIDlet midlet;

    public CurrenciesSelector(ConverterMIDlet midlet) {
        super("Select Currencies", List.MULTIPLE, midlet.currencies, null);
        this.midlet = midlet;
        setSelectedFlags(midlet.selected);
        setCommandListener(this);
        addCommand(new Command("Save", Command.OK, 1));
    }

    public void commandAction(Command c, Displayable d) {
        if (c.getCommandType() == Command.OK) {
            getSelectedFlags(midlet.selected);
            midlet.notifySettingsChanged();
        }
    }
}

四、 多設備配置並行測試

  1. 項目屬性 → Manage Configurations → Add → Name: QwertyDevice。
  2. 取消勾選「Use Values from DefaultConfiguration」,Platform → Device 選 QwertyDevice。
  3. 工具欄 Configuration 下拉框切換 DefaultConfiguration / QwertyDevice,分別 Run Main Project,兩個模擬器同時運行,對比佈局、鍵盤交互差異。

五、 關鍵知識點總結

知識點實現位置備註
RMS 持久化ConverterMIDlet.loadSettings/saveSettingsDataInput/OutputStream + ByteArrayInput/OutputStream 序列化
高級 UI 組件Form + TextField (NUMERIC) / List (MULTIPLE)自動佈局、命令映射、ItemStateListener 實時計算
MIDlet 導航Display.setCurrent() 切換 Displayable無堆棧式導航,手動管理返回邏輯
多配置測試Project Properties → Configurations同一源碼,不同設備描述符,一鍵切換

六、 常見問題排查

  • 模擬器啟動報 "Error verifying class":未預驗證,Clean & Build 重試。
  • RMS 讀取拋出 RecordStoreException:首次運行無記錄,捕獲異常使用默認值。
  • 轉換結果為 0:檢查 rates 數量級(本例 *1_000_000),convert() 除以 1_000_000。
  • 中文亂碼:JAD 文件中文屬性需用 native2ascii 轉 Unicode 轉義。

七、 總結

通過樣例學習 → 手寫核心三類 → 多設備驗證,你已掌握 NetBeans Mobility Pack 開發 MIDP 應用的完整閉環。下一步可嘗試:接入真實匯率 Web Service (JSR 172)、添加圖標/啟動畫面、打包 OTA 部署至真機。

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