Item → ChoiceGroup, TextField, DateField, Gauge, ImageItem, StringItem, CustomItem)ItemStateListener.itemStateChanged(Item item)setSelectedIndex())不會 觸發回調,僅用戶互動觸發ItemStateListener 並註冊:form.setItemStateListener(this)Form 拖入 ChoiceGroup(EXCLUSIVE 單選模式),屬性設定:
• Label: "天氣類型"
• Items: 晴 / 陰 / 雨 / 雪
• Default: 晴 (index 0)
• Layout: LAYOUT_DEFAULT
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 + "天");
}
}
}
啟動 → 顯示表單,標題「你選擇了晴天」
用戶選擇「雨」 → 回調觸發 → 標題即時更新為「你選擇了雨天」
程式碼呼叫 weatherCG.setSelectedIndex(2, true) → 無回調,標題不變
itemStateChanged 中檢查必填欄位,動態啟用/禁用「提交」命令| 誤區 | 正確認知 |
|---|---|
| 程式修改 Item 會觸發回調 | 僅用戶互動觸發,程式修改不觸發 |
| 忘記註冊 setItemStateListener | 必須在 Form 上註冊,Item 本身無監聽註冊方法 |
| 混淆 CommandListener 與 ItemStateListener | 前者處理軟鍵命令,後者處理元件值變更,職責分離 |