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

J2ME Canvas 多行文字顯示架構:字串分割與動態繪製模式

     編輯:J2ME

設計目標

在低階 UI (Canvas) 上顯示長文本(遊戲說明、關於畫面、公告),需支援:

  • 內容與長度可動態變更,無需修改繪圖邏輯。
  • 自動換行適應螢幕寬度。
  • 易於維護:修改單一字串常數即可更新全文。

三步驟實作模式

  1. 資料層:以單一字串儲存完整內容(可來自資源檔、網路、RMS)。
  2. 處理層:編寫 String[] wrapText(String text, Font font, int maxWidth),依字體度量將字串切分為行陣列。
  3. 顯示層:paint(Graphics g) 中迴圈繪製行陣列,計算 Y 軸位置。

核心分割方法簽名

public String[] wrapText(String text, Font font, int maxWidth) {
    Vector lines = new Vector();
    int start = 0;
    for (int i=0;i maxWidth) {
            // 尋找最近空格或標點斷行(簡化版直接硬切)
            lines.addElement(text.substring(start, i));
            start = i;
        }
    }
    lines.addElement(text.substring(start));
    String[] arr = new String[lines.size()];
    lines.copyInto(arr);
    return arr;
}

實際專案建議整合「智慧型字串換行演算法」(參考 ID 78126)處理中英混排與單詞完整性。

繪製範例

class TextCanvas extends Canvas {
    private String[] contentLines;
    private int lineHeight;

    public TextCanvas(String fullText) {
        Font f = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
        contentLines = wrapText(fullText, f, getWidth()-20);
        lineHeight = f.getHeight() + 2;
    }

    protected void paint(Graphics g) {
        g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(0x000000);
        int y = 10;
        for (String line : contentLines) {
            g.drawString(line, 10, y, Graphics.TOP|Graphics.LEFT);
            y += lineHeight;
        }
    }
}

擴充:捲動支援

  • 記錄 scrollOffset(首行索引),鍵盤上下鍵增減。
  • paint 僅繪製可見範圍 contentLines[scrollOffset ... scrollOffset+visibleLines]。
  • 邊界檢查:0 <= scrollOffset <= contentLines.length - visibleLines。

優點總結

  1. 關注點分離:文案編輯者只動字串,程式設計師只動演算法。
  2. 跨裝置適配:getWidth() 動態取得螢幕寬度,同一套碼跑在 128×128 與 240×320 均正常。
  3. 國際化友善:字串可外置到資源檔,分割邏輯不變。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved