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

J2ME StringItem 進階用法:HYPERLINK 與 BUTTON 外觀模式實現互動式文字

     編輯:J2ME

StringItem 三種外觀模式

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) { ... }
    }
}

關鍵實作細節

  1. 實作 ItemCommandListener:專門處理 Item 子類 (StringItem, TextField, ChoiceGroup 等) 的命令事件,方法簽名 commandAction(Command, Item)。
  2. 設定預設命令:setDefaultCommand(Command) 定義按 FIRE 鍵時觸發的命令。
  3. 命令類型用 Command.ITEM:優先級通常為 1-2,區別於 Command.OK/EXIT/BACK。
  4. 同時實作兩個介面: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。
  • ❌ 假設所有裝置都支援 HYPERLINK/BUTTON:MIDP 2.0 強制支援,但視覺效果差異極大 (有的只加底線、有的完整按鈕渲染),需真機測試。
  • ✅ Alert.setTimeout(Alert.FOREVER) 讓用戶確認關閉,避免提示一閃而過。

適用場景建議

  • HYPERLINK:網址、電話、Email、說明文檔跳轉、隱私政策連結。
  • BUTTON:表單提交、刷新、搜尋、登入、購買等明確動作觸發點。
  • PLAIN:純資訊顯示、標籤、說明文字。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved