NetBeans Mobility Pack 4.0 提供可視化向導、模擬器管理、多設備配置、源碼編輯器輔助,讓 J2ME 開發效率大幅提升。本教程分兩階段:先跑通內置樣例,再從零手寫完整應用,涵蓋項目創建、MIDlet/表單/列表編碼、RMS 持久化、多模擬器並行測試。
NewCurrencyConverter,勾選 Set as Main Project。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;
}
}
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
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();
}
}
}
| 知識點 | 實現位置 | 備註 |
|---|---|---|
| RMS 持久化 | ConverterMIDlet.loadSettings/saveSettings | DataInput/OutputStream + ByteArrayInput/OutputStream 序列化 |
| 高級 UI 組件 | Form + TextField (NUMERIC) / List (MULTIPLE) | 自動佈局、命令映射、ItemStateListener 實時計算 |
| MIDlet 導航 | Display.setCurrent() 切換 Displayable | 無堆棧式導航,手動管理返回邏輯 |
| 多配置測試 | Project Properties → Configurations | 同一源碼,不同設備描述符,一鍵切換 |
rates 數量級(本例 *1_000_000),convert() 除以 1_000_000。native2ascii 轉 Unicode 轉義。通過樣例學習 → 手寫核心三類 → 多設備驗證,你已掌握 NetBeans Mobility Pack 開發 MIDP 應用的完整閉環。下一步可嘗試:接入真實匯率 Web Service (JSR 172)、添加圖標/啟動畫面、打包 OTA 部署至真機。