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

J2ME Item 狀態監聽機制實戰:以 ChoiceGroup 為例的完整開發流程

     編輯:J2ME

Item 類體系與狀態監聽核心概念

  • Item 是 Form 的可互動子元件(繼承關係:Item → ChoiceGroup, TextField, DateField, Gauge, ImageItem, StringItem, CustomItem)
  • 用戶操作引發狀態變更時,自動回調 ItemStateListener.itemStateChanged(Item item)
  • 關鍵區別:程式碼主動修改 Item 狀態(如 setSelectedIndex())不會 觸發回調,僅用戶互動觸發
  • MIDlet 需實作 ItemStateListener 並註冊:form.setItemStateListener(this)

完整開發實戰:天氣選擇表單

1. NetBeans 視覺化設計

Form 拖入 ChoiceGroup(EXCLUSIVE 單選模式),屬性設定:
• Label: "天氣類型"
• Items: 晴 / 陰 / 雨 / 雪
• Default: 晴 (index 0)
• Layout: LAYOUT_DEFAULT

2. 核心代碼實現


public class WeatherMIDlet extends MIDlet implements CommandListener, ItemStateListener {
    private Form form;
    private ChoiceGroup weatherCG;
    private Command exitCmd;
    private boolean midletPaused = false;
    private Display display;

    protected void startApp() throws MIDletStateChangeException {
        if (midletPaused) resumeMIDlet();
        else { initialize(); startMIDlet(); }
        midletPaused = false;
    }
    protected void pauseApp() { midletPaused = true; }
    protected void destroyApp(boolean unconditional) {}

    private void initialize() {
        form = new Form("Welcome");
        weatherCG = new ChoiceGroup("天氣類型", Choice.EXCLUSIVE);
        weatherCG.append("晴", null);
        weatherCG.append("陰", null);
        weatherCG.append("雨", null);
        weatherCG.append("雪", null);
        weatherCG.setSelectedIndex(0, true);
        weatherCG.setLayout(Item.LAYOUT_DEFAULT);
        weatherCG.setFitPolicy(Choice.TEXT_WRAP_DEFAULT);
        
        exitCmd = new Command("退出", Command.EXIT, 0);
        form.addCommand(exitCmd);
        form.append(weatherCG);
        form.setCommandListener(this);
        form.setItemStateListener(this);  // 關鍵:註冊 Item 狀態監聽
        form.setTitle("你選擇了晴天");    // 初始標題
    }

    private void startMIDlet() {
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }

    // Command 處理
    public void commandAction(Command c, Displayable d) {
        if (c == exitCmd) { destroyApp(true); notifyDestroyed(); }
    }

    // Item 狀態變更回調:僅用戶互動觸發
    public void itemStateChanged(Item item) {
        if (item == weatherCG) {
            int idx = weatherCG.getSelectedIndex();
            String selected = weatherCG.getString(idx);
            form.setTitle("你選擇了" + selected + "天");
        }
    }
}

3. 運行效果

啟動 → 顯示表單,標題「你選擇了晴天」
用戶選擇「雨」 → 回調觸發 → 標題即時更新為「你選擇了雨天」
程式碼呼叫 weatherCG.setSelectedIndex(2, true) → 無回調,標題不變

進階應用模式

  • 表單驗證:在 itemStateChanged 中檢查必填欄位,動態啟用/禁用「提交」命令
  • 聯動選單:選擇「國家」ChoiceGroup 變更 → 動態重建「城市」ChoiceGroup 選項
  • 即時預覽:Gauge/Slider 變更 → 即時更新圖片亮度/音量預覽
  • CustomItem:自定義繪製與互動元件,同樣支援狀態監聽

常見誤區與避坑

結語

Item 狀態監聽機制是 J2ME 高階 UI 互動的核心。理解「用戶互動觸發、程式修改不觸發、Form 統一註冊」三大鐵律,配合視覺化設計工具快速構建表單,即可實現豐富、響應式的行動應用介面邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
誤區正確認知
程式修改 Item 會觸發回調僅用戶互動觸發,程式修改不觸發
忘記註冊 setItemStateListener必須在 Form 上註冊,Item 本身無監聽註冊方法
混淆 CommandListener 與 ItemStateListener前者處理軟鍵命令,後者處理元件值變更,職責分離