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

J2ME 畫面切換機制詳解:Display.setCurrent() 與父子畫面回傳模式實戰

     編輯:J2ME

核心概念:Display 與 Displayable

  • Display:每個 MIDlet 單例,代表裝置顯示管理器,Display.getDisplay(this) 取得
  • Displayable:可顯示介面的父介面,Form、Canvas、List、TextBox、Alert 皆實作此介面
  • 切換畫面唯一 API:display.setCurrent(Displayable next)

基本切換模式


// 主 MIDlet 中
private Display display;
private Form mainForm = new Form("主選單");

public void startApp() {
    display = Display.getDisplay(this);
    display.setCurrent(mainForm); // 顯示主選單
}

// 切換至子畫面(如設定頁)
private Form settingsForm = new Form("設定");
public void showSettings() {
    display.setCurrent(settingsForm);
}

進階模式:父畫面引用回傳(關鍵技巧)

子畫面需要知道「從哪裡來、回哪裡去」。標準做法是建構子傳遞父畫面引用:


// 子畫面類別
public class SettingsScreen extends Form {
    private Display display;
    private Displayable parent; // 父畫面引用
    
    public SettingsScreen(Display display, Displayable parent) {
        super("設定");
        this.display = display;
        this.parent = parent; // 保存父畫面
        
        // 新增「返回」命令
        Command backCmd = new Command("返回", Command.BACK, 1);
        addCommand(backCmd);
        setCommandListener(this);
    }
    
    public void commandAction(Command c, Displayable d) {
        if (c.getCommandType() == Command.BACK) {
            display.setCurrent(parent); // 關鍵:回到父畫面
        }
    }
}

// 主 MIDlet 使用方式
public void showSettings() {
    display.setCurrent(new SettingsScreen(display, mainForm)); // 傳入自己作為父畫面
}

狀態保持與資料傳遞

  • 父畫面狀態自動保持:mainForm 物件未銷毀,內部輸入欄位、游標位置、捲動位置完整保留
  • 資料回傳:子畫面可持有父畫面具體類別引用(如 MainForm),呼叫 parent.onSettingsSaved(data) 回調
  • 避免記憶體洩漏:子畫面不應長期持有父畫面引用超出生命週期,返回時清空或讓 GC 回收

常見錯誤與最佳實踐

錯誤做法問題正確做法
每次切換 new Form()狀態丟失、記憶體抖動複用實例,或建構子傳遞必要資料
子畫面靜態引用 MIDlet耦合度高、難測試、記憶體洩漏風險建構子注入 Display + Displayable parent
忽略 Command.BACK 型別軟鍵標籤不符合平台慣例(右軟鍵應為返回)返回命令使用 Command.BACK,確認用 Command.OK

Canvas 畫面切換特殊處理

GameCanvas/Canvas 切換同理,但需注意:

  1. 離開時覆寫 hideNotify() 停止遊戲迴圈、釋放音效
  2. 進入時覆寫 showNotify() 重置狀態、啟動迴圈
  3. 雙緩衝模式下確保 flushGraphics() 正確呈現
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved