JavaMe开发绘制可自动换行文本

【问题描述】

JavaMe Graphics类中的drawString不支持文本换行,这样绘制比较长的字符串时,文本被绘制在同一行,超过屏幕部分的字符串被截断了。如何使绘制的文本能自动换行呢?

【分析】

drawString无法实现自动换行,但可以实现文本绘制的定位。因此可考虑,将文本拆分为多个子串,再对子串进行绘制。拆分的策略如下:

1 遇到换行符,进行拆分;

2 当字符串长度大于设定的长度(一般为屏幕的宽度),进行拆分。

【步骤】

1 定义一个String和String []对象;

private String info;
private String info_wrap[]; 

2 实现字符串自动换行拆分函数

StringDealMethod.java

package com.token.util; 

import java.util.Vector; 

import javax.microedition.lcdui.Font; 

public class StringDealMethod {
  public StringDealMethod()
  { 

  } 

  // 字符串切割,实现字符串自动换行
  public static String[] format(String text, int maxWidth, Font ft) {
     String[] result = null;
     Vector tempR = new Vector();
     int lines = 0;
     int len = text.length();
     int index0 = 0;
     int index1 = 0;
     boolean wrap;
     while (true) {
     int widthes = 0;
     wrap = false;
     for (index0 = index1; index1 < len; index1++) {
      if (text.charAt(index1) == '\n') {
        index1++;
        wrap = true;
        break;
        }
        widthes = ft.charWidth(text.charAt(index1)) + widthes; 

        if (widthes > maxWidth) {
        break;
        }
       }
       lines++; 

       if (wrap) {
        tempR.addElement(text.substring(index0, index1 - 1));
       } else {
        tempR.addElement(text.substring(index0, index1));
       }
       if (index1 >= len) {
        break;
       }
       }
       result = new String[lines];
       tempR.copyInto(result);
       return result;
      } 

  public static String[] split(String original, String separator) {
    Vector nodes = new Vector();
    //System.out.println("split start...................");
    //Parse nodes into vector
    int index = original.indexOf(separator);
    while(index>=0) {
    nodes.addElement( original.substring(0, index) );
    original = original.substring(index+separator.length());
    index = original.indexOf(separator);
    }
    // Get the last node
    nodes.addElement( original ); 

    // Create splitted string array
    String[] result = new String[ nodes.size() ];
    if( nodes.size()>0 ) {
    for(int loop=0; loop<nodes.size(); loop++)
    {
    result[loop] = (String)nodes.elementAt(loop);
    //System.out.println(result[loop]);
    } 

    } 

    return result;
    }
}

3 调用拆分函数,实现字符串的拆分

int width = getWidth(); 

Font ft = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_LARGE); 

info = "欢迎使用!\n"
  +"1 MVC测试;\n"
  +"2 自动换行测试,绘制可自动识别换行的字符串。\n";
info_wrap = StringDealMethod.format(info, width-10, ft);

4 绘制字符串

int width = getWidth(); 

Font ft = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_LARGE); 

info = "欢迎使用!\n"
  +"1 MVC测试;\n"
  +"2 自动换行测试,绘制可自动识别换行的字符串。\n";
info_wrap = StringDealMethod.format(info, width-10, ft);

绘制的效果如图1所示:

(0)

相关推荐

  • 通过Java正则表达式去掉SQL代码中回车换行和多余空格

    复制代码 代码如下: public static void main(String[] args) { String sql = "SELECT * FROM \n" + " `testdb`.`foo` LIMIT 0, 100"; String s = "SELECT * FROM `testdb`.`foo` LIMIT 0, 100"; String sql2 = Pattern.compile(" {2,}").ma

  • Java中\n和\r区别

    符号        ASCII码          意义 \n              10              换行NL \r               13              回车CR 回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return 换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed 在不同的操作系统这几个字符表现不同,比如在WIN系统

  • Java 替换字符串中的回车换行符的方法

    使用正则表达式进行替换: 代码片段: String documentTxt = EntityUtils.toString(entity,"gbk");//获取数据 documentTxt=documentTxt.replaceAll("[\\t\\n\\r]", "");//将内容区域的回车换行去除 说明:String类的replaceAll就有正则替换功能. \t为制表符 \n为换行 \r为回车 java正则使用: 示例方法: 复制代码 代码如

  • Java Swing中的文本区(JTextArea)实现换行保存到文件的几个方法

    1.如果是采用流的方式一行一行写到文件中,可以把FileWriter换为PrintWriter,然后调用PrintWriter的println()方法. 2. 复制代码 代码如下: byte fileContent[] = getJTextArea().getText().replaceAll("\n", "\r\n").getBytes();//此处主要是为了在Windows中实现换行操作 3. 复制代码 代码如下: FileWriter fw=new FileW

  • java去除字符串中的空格、回车、换行符、制表符的小例子

    复制代码 代码如下: import java.util.regex.Matcher;import java.util.regex.Pattern; /** * @author lei * 2011-9-2 */public class StringUtils { public static String replaceBlank(String str) {        String dest = "";        if (str!=null) {            Patte

  • JavaMe开发绘制可自动换行文本

    [问题描述] JavaMe Graphics类中的drawString不支持文本换行,这样绘制比较长的字符串时,文本被绘制在同一行,超过屏幕部分的字符串被截断了.如何使绘制的文本能自动换行呢? [分析] drawString无法实现自动换行,但可以实现文本绘制的定位.因此可考虑,将文本拆分为多个子串,再对子串进行绘制.拆分的策略如下: 1 遇到换行符,进行拆分: 2 当字符串长度大于设定的长度(一般为屏幕的宽度),进行拆分. [步骤] 1 定义一个String和String []对象: priv

  • JavaMe开发绘制文本框TextEdit

    [问题描述] TextEdit是采用GameCanvas绘制的文本编辑器.本文结合实例给出实现的方法. [原理] 1 运用Graphics.GameCanvas绘制文本框和光标. 2 检测到输入事件时,跳转到 高级界面->TextBox .通过系统调用输入法完成输入. 3 将TextBox输入的值返回给TextEdit对象. [设计模式] 这个过程有点类似装饰模式,实际上,实现输入的还是TextBox,只是给TextBox装饰了一下,形成了一个漂亮的外观. [代码清单] TextEdit.jav

  • JavaMe开发自适应滚动显示

    [问题描述] 我们常看到一些滚动显示的实例,比如UC浏览器中,显示网页的内容.当内容比较多时,采用滚动分页显示是合理的.在Canvas中绘图中,多余的内容被截断了.如何实现滚动分页显示呢? [原理] JavaMe中有一个坐标变换的功能.当触发相应的按键事件时,我们就让其显示相应的页,并且使滚动条滚动到相应的位置. [代码清单] ShowHelp.java package com.token.view; import javax.microedition.lcdui.Font; import ja

  • js+html5实现canvas绘制镂空字体文本的方法

    本文实例讲述了js+html5实现canvas绘制镂空字体文本的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html> <html> <body> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;"> Your browser does not s

  • asp.net微信开发(高级群发文本)

    首先我们先来讲解一下群发文本信息的过程,我个人开发程序是首先要有UI才能下手去写代码,界面如下, 看图我们也可以看出首先我们要获取该微信号本月还能群发几条信息,关于怎么计算,就是群发成功一条信息,就在本地数据库存储一条信息,用来计算条数,(这个我相信都会),大于4条就不能发送(这里我已经限制死了,因为服务号每月只能发送4条,多发送也没用,用户只能收到4条,除非使用预览功能,挨个发送,但预览功能也只能发送100次,或许可能使用开发者模式下群发信息可以多发送N次哦,因为我群发了两次之后,再进入到微信

  • C#微信开发之接收 / 返回文本消息

    接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息微信开发文档,对微信的这种消息处理机制有一定了解之后再着手开发(微信开发接收普通消息开发文档) 注意点: 1.关于重试的消息排重,推荐使用msgid排重. 2.微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此

  • Java微信公众平台开发(5) 文本及图文消息回复的实现

    上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为[普通消息]和[多媒体消息],这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段[openid],它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字! (一)回复文本消息 在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在[文本消息]类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToU

  • C++开发绘制正弦曲线的方法

    本文实例为大家分享了C++绘制正弦曲线的具体代码,供大家参考,具体内容如下 通过OnDraw函数绘制图形 过程为先绘制两个坐标轴,再绘制正弦曲线的方法.其中将曲线分解为660个像素点,让其看起来更像"曲线" void CMFCApplication3View::OnDraw(CDC* pDC) { CMFCApplication3Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CPen cpen, pe

  • print不自动换行,puts会自动换行第1/2页

    1.print不自动换行,puts会自动换行,一行不够写的话,可以加"\"进行连接 ruby 代码 puts 6/2 print 6/1 puts 'hello world' puts '我们都是'\ '中国人' 运行结果: ruby 代码 3 6hello world 我们都是中国人 2.==,eql?,equal? 区别 ==值相等 eql?值相等,类型相等 equal?值相等,内存地址相等 a=1 b=1.0 c=1.0 d=1.0 e=c puts(a==b)#值相等 puts

  • 详解微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者我们希望文本超出自动换行或者用省略号表示,光靠这个API是无法完成的.下面本人就讲下我在开发中是如何解决这个问题的. 1 wxml代码 <canvas canvas-id="myCanvas" style="border: 1px solid;"/> 2 w

随机推荐