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

MIDP List 元件完全指南:三種選擇模式與動態操作

     編輯:J2ME

List 元件簡介

List 屬於 MIDP 高層 API,繼承自 Screen,實作 Choice 介面,用於顯示可選擇的字串清單,可選搭配圖示。所有高層 UI 類別均在 javax.microedition.lcdui 套件中。

三種選擇模式

常數行為視覺隱喻
List.EXCLUSIVE單選:同一時間僅能選取一項,選新項自動取消舊項單選按鈕
List.MULTIPLE多選:可同時選取零項或多項核取方塊
List.IMPLICIT隱含選擇:外觀如單選,但選取動作會觸發 SELECT_COMMAND 事件功能表項目

建構與初始化

// 方式一:逐項新增
List list = new List("Choose fruit:", List.EXCLUSIVE);
list.append("Orange", null);
list.append("Apple", null);
list.append("Pear", null);

// 方式二:陣列一次建構
String[] fruits = {"Orange", "Apple", "Pear"};
List list2 = new List("Choose fruit:", List.EXCLUSIVE, fruits, null);

圖示為選用,實現方可能忽略;傳入 null 最安全。

命令監聽與事件處理

EXCLUSIVE 與 MULTIPLE 模式下,使用者瀏覽不會產生事件,必須註冊至少一個 Command 並設定 CommandListener 才能接收動作。IMPLICIT 模式下,選取項目會自動送出 List.SELECT_COMMAND。

list.setCommandListener(this); // 實作 CommandListener

public void commandAction(Command c, Displayable d) {
    if (c == List.SELECT_COMMAND) {
        // IMPLICIT 模式下的選取處理
    } else if (c == exitCmd) { ... }
}

動態操作清單內容

List 提供 append、insert、delete、set 等方法,可隨時修改項目。清除所有項目範例:

public static void deleteAll(List l) {
    int n = l.size();
    while (n-- > 0) l.delete(n);
}

亦可繼承 List 擴充 deleteAll() 方法。

取得與設定選取狀態

  • EXCLUSIVE / IMPLICIT:getSelectedIndex() 回傳索引(-1 表無選取)。
  • MULTIPLE:getSelectedFlags(boolean[]) 將各項選取狀態寫入陣列;或逐項檢查 isSelected(index)。
  • 設定選取:setSelectedIndex(index, true) 或 setSelectedFlags(boolean[])。

圖示處理建議

  • 尺寸建議 10×10 至 16×16 像素,統一大小確保版面整齊。
  • 不可變更圖示(immutable),可用 Image.createImage("/path.png") 從 JAR 載入,或離屏緩衝動態生成。
  • 文字需獨立表達含義,不應依賴圖示。

完整範例:切換三種模式

public class ListDemo extends MIDlet implements CommandListener {
    private Display display;
    private int mode = List.IMPLICIT;
    private Command exitCmd = new Command("Exit", Command.SCREEN, 2);
    private Command selectCmd = new Command("Select", Command.OK, 1);
    private Command nextCmd = new Command("Next", Command.SCREEN, 2);
    private static final String[] ITEMS = {"First","Second","Third","Fourth"};

    protected void startApp() {
        if (display == null) {
            display = Display.getDisplay(this);
            display.setCurrent(new SampleList(mode));
        }
    }
    // pauseApp、destroyApp、exitMIDlet 略...

    class SampleList extends List implements CommandListener {
        SampleList(int mode) {
            super("", mode, ITEMS, null);
            addCommand(exitCmd); addCommand(selectCmd); addCommand(nextCmd);
            setCommandListener(this);
            switch(mode) {
                case IMPLICIT: setTitle("Implicit"); break;
                case EXCLUSIVE: setTitle("Exclusive"); break;
                case MULTIPLE: setTitle("Multiple"); break;
            }
            this.mode = mode;
        }
        public void commandAction(Command c, Displayable d) {
            if (c == exitCmd) exitMIDlet();
            else if (c == selectCmd) showSelection(false);
            else if (c == List.SELECT_COMMAND) showSelection(true);
            else if (c == nextCmd) {
                if (mode == List.IMPLICIT) mode = List.EXCLUSIVE;
                else if (mode == List.EXCLUSIVE) mode = List.MULTIPLE;
                else mode = List.IMPLICIT;
                display.setCurrent(new SampleList(mode));
            }
        }
        private void showSelection(boolean implicit) {
            Alert alert = new Alert(implicit ? "Implicit Selection" : "Explicit Selection");
            StringBuffer buf = new StringBuffer();
            if (mode == MULTIPLE) {
                boolean[] sel = new boolean[size()];
                getSelectedFlags(sel);
                for (int i=0;i0) buf.append(", ");
                    else buf.append("You selected: ");
                    buf.append(getString(i));
                }
                if (buf.length()==0) buf.append("No items are selected.");
            } else {
                buf.append("You selected ").append(getString(getSelectedIndex()));
            }
            alert.setString(buf.toString());
            alert.setTimeout(Alert.FOREVER);
            display.setCurrent(alert, display.getCurrent());
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved