javax.microedition.lcdui.StringItem 除預設 PLAIN 純文字外,MIDP 2.0 新增兩種互動模式,讓文字具備按鈕/連結行為:
| 模式常量 | 視覺效果 | 互動行為 | 觸發事件 |
|---|---|---|---|
StringItem.PLAIN | 普通文字 | 無 | 無 |
StringItem.HYPERLINK | 底線、高亮色 (裝置定) | 像超連結,按 FIRE 觸發 | ItemCommandListener |
StringItem.BUTTON | 按鈕外觀 (裝置定) | 像按鈕,按 FIRE 觸發 | ItemCommandListener |
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class StringItemDemo extends MIDlet
implements CommandListener, ItemCommandListener {
private Form form;
private StringItem linkItem, btnItem;
private Command exitCmd, okCmd, linkCmd, btnCmd;
private Display display;
private Alert linkAlert, btnAlert;
public StringItemDemo() {
form = new Form("StringItem 互動示範");
// 1. 超連結模式
linkItem = new StringItem(null, "點此撥打客服熱線", StringItem.HYPERLINK);
linkCmd = new Command("撥打", Command.ITEM, 1);
linkItem.setDefaultCommand(linkCmd);
linkItem.setItemCommandListener(this);
linkAlert = new Alert("客服熱線", "800-810-1234", null, AlertType.INFO);
// 2. 按鈕模式
btnItem = new StringItem(null, "檢查更新", StringItem.BUTTON);
btnCmd = new Command("檢查", Command.ITEM, 1);
btnItem.setDefaultCommand(btnCmd);
btnItem.setItemCommandListener(this);
btnAlert = new Alert("檢查更新", "已是最新版本", null, AlertType.INFO);
form.append("需要幫助?");
form.append(linkItem);
form.append(btnItem);
exitCmd = new Command("離開", Command.EXIT, 1);
okCmd = new Command("確定", Command.OK, 1);
form.addCommand(exitCmd);
form.addCommand(okCmd);
form.setCommandListener(this);
}
protected void startApp() {
display = Display.getDisplay(this);
display.setCurrent(form);
}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
// Form/Canvas 層級命令 (離開/確定)
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) {
destroyApp(false);
notifyDestroyed();
}
}
// StringItem 專屬命令 (連結/按鈕)
public void commandAction(Command c, Item item) {
if (c == linkCmd) {
display.setCurrent(linkAlert, form);
} else if (c == btnCmd) {
display.setCurrent(btnAlert, form);
}
// 亦可用 item 判斷:
// if (item == linkItem) { ... } else if (item == btnItem) { ... }
}
}
ItemCommandListener:專門處理 Item 子類 (StringItem, TextField, ChoiceGroup 等) 的命令事件,方法簽名 commandAction(Command, Item)。setDefaultCommand(Command) 定義按 FIRE 鍵時觸發的命令。Command.ITEM:優先級通常為 1-2,區別於 Command.OK/EXIT/BACK。CommandListener (Form/Canvas) + ItemCommandListener (Item),方法簽名不同,無衝突。
// 運行時切換外觀 (MIDP 2.0)
linkItem.setAppearanceMode(StringItem.BUTTON); // 連結變按鈕
btnItem.setAppearanceMode(StringItem.PLAIN); // 按鈕變純文字
// 字體與顏色 (受裝置限制,部分模式不可控)
linkItem.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_UNDERLINED, Font.SIZE_MEDIUM));
// 注意:HYPERLINK/BUTTON 模式下,字體/顏色常由系統接管,setFont/setColor 可能無效
form.setCommandListener(this) → Form 層級命令 (離開) 無反應 (原文範例即有此錯誤)。commandAction:(Command, Displayable) 處理 Form/Canvas,(Command, Item) 處理 StringItem 等 Item。Alert.setTimeout(Alert.FOREVER) 讓用戶確認關閉,避免提示一閃而過。