雖然 MIDP 2.0 標準提供 setFullScreenMode(true),但實際測試發現許多機型 (S60、S40、MOTO、SoftBank 3GC 等) 呼叫後 getWidth()/getHeight() 仍回傳非全螢幕尺寸。本文提供通用解決策略。
sizeChanged(int w, int h) 取得真實螢幕尺寸。setFullScreenMode(true),再延遲極短時間 (如 100ms) 後讀取尺寸,確保視窗狀態已更新。updateScreen() 多重調用,兼容不同機型行為。class MyCanvas extends Canvas implements Runnable {
static int scrW = 0;
static int scrH = 0;
public MyCanvas() {
System.out.println(System.getProperty("microedition.platform"));
setFullScreenMode(true);
try { Thread.sleep(100); } catch (Exception e) {} // 保險延遲
updateScreen(getWidth(), getHeight());
new Thread(this).start();
}
// 系統自動回呼:全螢幕模式切換完成後觸發
protected void sizeChanged(int w, int h) {
updateScreen(w, h);
}
public void updateScreen(int _w, int _h) {
scrW = _w;
// 僅當高度增大時更新,避免重複處理
if (_h > scrH) {
scrH = _h;
} else {
return;
}
// 若使用雙緩衝,在此重建 bufferImage
// if (useDoubleBuffer) bufferImage = Image.createImage(scrW, scrH);
}
public void run() {
// 執行緒中再次嘗試更新,雙重保險
updateScreen(getWidth(), getHeight());
}
public void paint(Graphics g) {
// 繪圖邏輯
}
}
Thread.sleep(100) 非絕對必要,若特定機型仍失效可嘗試增加至 1000ms。updateScreen 判斷 _h > scrH 防止多次回呼導致閃爍或邏輯錯誤。