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

J2ME Canvas 長文本自動換行繪製工具類實現

     編輯:J2ME

問題背景

Canvas 繪製文本時,drawString 不支持自動換行。需根據屏幕寬度、字體度量,將長字符串分割為多行再逐行繪製。

核心工具方法

import java.util.Vector;
import javax.microedition.lcdui.Font;

/**
 * 將字符串按像素寬度分割為多行,支持中英文混排、顯式換行符
 * @param f 目標字體
 * @param str 待分割字符串
 * @param maxWidthPx 最大行寬(像素)
 * @return Vector 每行文本
 */
public static Vector splitStringByWidth(Font f, String str, int maxWidthPx) {
    if (str == null) return null;
    Vector lines = new Vector();
    char[] chars = str.toCharArray();
    int lineWidth = 0;
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        int charWidth = f.charWidth(c);

        // 遇到顯式換行符 或 加上當前字符超過最大寬度
        if (c == '\n' || lineWidth + charWidth > maxWidthPx) {
            lines.addElement(sb.toString());
            sb = new StringBuffer();
            lineWidth = 0;
            if (c != '\n') { // 換行符不計入新行
                sb.append(c);
                lineWidth = charWidth;
            }
        } else {
            sb.append(c);
            lineWidth += charWidth;
        }
    }
    if (sb.length() > 0) lines.addElement(sb.toString());
    return lines;
}

繪製調用示例

// 在 Canvas.paint(Graphics g) 中
Vector lines = splitStringByWidth(font, longText, getWidth() - 4); // 留 2px 邊距
int y = startY;
int lineHeight = font.getHeight();
for (int i = 0; i < lines.size(); i++) {
    String line = (String) lines.elementAt(i);
    g.drawString(line, 2, y, Graphics.LEFT | Graphics.TOP);
    y += lineHeight;
}

關鍵點說明

  1. 像素級精確控制:使用 Font.charWidth(char) 而非字符數,完美支持中英文混排 (中文通常雙倍寬度)。
  2. 顯式換行符處理:遇到 \n 強制換行,不計入寬度。
  3. Vector 存儲:J2ME 無 List/ArrayList,Vector 是標準動態數組。
  4. 性能優化:可緩存分割結果,避免每幀重複計算;長文本可分頁緩存。

擴展建議

  • 添加對齊方式參數 (左/中/右對齊),計算 x 偏移量。
  • 支持富文本:顏色、粗體、字體大小切換 (需更複雜的 Span 模型)。
  • 超長文本分頁滾動:結合鍵盤上下鍵控制 startIndex。

總結

通過 Font.charWidth 精確度量、Vector 動態存儲、逐行 drawString 繪製,即可在 Canvas 上實現高性能、支持中英文混排的自動換行文本顯示,是 J2ME 低級 UI 開發的基礎組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved