JR 精品文章 - 基于MIDP1.0利用底层API实现文本自动换行
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » J2ME综合 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
基于MIDP1.0利用底层API实现文本自动换行
deadspace 原创   更新:2006-03-18 21:22:55  版本: 1.0   

在MIDP中,我们可以利用高层API在手机屏幕上输出文本,而且我们可以在输出的文本中插入转义字符'\n'来解决文本输出中的自动换行问题。但是,一般来说对于手机屏幕上的文本我们都是利用底层API绘制上去的。这样的话,就会引发一个文本在屏幕上如何换行的问题。
其实,我们可以利用字符宽度与屏幕宽度,来解决这个问题。即,把若干个字符的宽度相加,一直加到等于屏幕宽度后再绘制这些字符。绘制完毕后,移动到下一次要绘制的位置,继续重复上述工作。直到所有的字符绘制完毕。我们可以通过Font类的charWidth()获取字符的宽度。通过Canvas类的getWidth()获取设备屏幕的宽度。
请参看如下代码:
import javax.microedition.lcdui.*;
public class WordCanvas extends Canvas{

    /*
     * 要绘制的字符串
     */
    String str="abcdefghijklmnopqr\nstuvwxyz12345678901234\n5678901234567890123456789012\n34567890123456789012345678901234567890a";
    
    public void newline(Graphics g,Font font){
        /*
         * 表征字符串的索引,通过index获取字符串中的每一个字符
         */
        int index=0;
        /*
         * 若干个字符的宽度的总和
         */
        int charsWidth=0;
        /*
         * 绘制每一行字符串时,锚点的列坐标
         */
        int row=0;
        
        char ch;
        /*
         * buf用来临时存储屏幕上的一行字符串,即buf中存储的每个字符的宽度之和等于屏幕宽度时
         * 就把buf中的字符串绘制到屏幕上,同时清空buf,以便重新存储下一行字符。
         */
        StringBuffer buf=new StringBuffer();
        
        /*
         * 通过循环遍历字符串中的每一个字符
         */
        while(index<str.length()){
            
            ch=str.charAt(index++);//获取一个字符
            
            if(ch=='\n'){//如果文本中有换行符,则立即换行。
                
                //把buf中的字符绘制到屏幕上
                g.drawString(buf.toString(),0,row,Graphics.TOP|Graphics.LEFT);
                buf.delete(0,buf.length());//清空buf
                charsWidth=0;//字符宽度和清0
                row+=font.getHeight();//通过getHeight()确定下一行的绘制位置
                
            }else{//如果没有遇到换行符的话,把新字符的宽度进行累加
                charsWidth+=font.charWidth(ch);

                if(charsWidth<=this.getWidth()){//如果字符宽度和小于屏幕宽度,则把字符添加到buf中
                    buf.append(ch);
                    
                }else{//如果字符宽度和大于屏幕宽度,则要绘制buf中的字符,并清空buf。        
                    g.drawString(buf.toString(),0,row,Graphics.TOP|Graphics.LEFT);
                    buf.delete(0,buf.length());
                    
                    //绘制完毕后,把刚刚获取的字符,添加到buf中,同时重置字符宽度和,定位下一行的绘制位置。
                    buf.append(ch);
                    charsWidth=font.charWidth(ch);
                    row+=font.getHeight();
                }
            }
        }

        //当循环结束后,在buf中会遗留一些字符没有绘制。这是因为在循环中只有当遇到换行符或字符排满一行时,才
        //进行绘制工作,可是往往在读到字符串尾部时,会遗留一些字符,它们恰恰不能凑满一行。所以循环结束后,还
        //要一次绘制工作。
        g.drawString(buf.toString(),0,row,Graphics.TOP|Graphics.LEFT);
    }
    
    public void paint(Graphics g){

            newline(g,Font.getDefaultFont());
    }
}


版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     7       1
作者其它文章: 作者全部文章

这个文章共有 0 条评论
主题: MIDP 2.0相对于MIDP1.0中新增加的类和方法 上一篇文章
返回文章列表 返回〔J2ME综合〕
下一篇文章 主题: 在J2ME中基于MIDP1.0实现组合按键


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号