到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comwww.javaresearch.org无关,不对该信息负责.通过http://www.javaresearch.org/article//showarticle.jsp?column=3&thread=48379访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
基于MIDP1.0利用底层API实现文本自动换行
作者:deadspace 来源:www.javaresearch.org  发布时间:2006-07-04 12:34:21.757


在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());
    }
}


 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读