#ff0000 06  2008 - #000655     Canvas.    j2me
#def         -   .   ,        drawString,.      .  Graphics        ,     j2me   .      ,       . 
 MultiLineText      
void SetTextPar()       ; 
void DrawMultStr()    ; 
void MoveDown(), void MoveUp()    ; 
void PageDown(), void PageUp()    . 

     MultiLineText.java   src  .         SetTextPar   .  SetTextPar    : 

public void SetTextPar(
        int x, 
        int y,
        int width,
        int height,
        int dy,
        int FontSize,
        int FontStyle,
        int FontType,
        Graphics graph,
        String LongString
        )

 x, y      ; width  height      ,    ; dy        (    ); FontSize    (Font.SIZE_LARGE, Font.SIZE_MEDIUM, Font.SIZE_SMALL); FontStyle    (Font.STYLE_BOLD, Font.STYLE_PLAIN, Font.STYLE_ITALIC); FontType    (Font.FACE_MONOSPACE, Font.FACE_PROPORTIONAL, Font.FACE_SYSTEM), graph  Graphics ; LongString   .
 ,    ,    DrawMultStr()     . 
     MultiLineText. 
import javax.microedition.lcdui.*;

public class MyCanvas extends Canvas
{
    private boolean isFirstRun=true;   .
    private MultiLineText MLT;

    public void paint(Graphics g)
    {
       int GrH=getHeight(); // 
       int GrW=getWidth(); // 
       if (isFirstRun==true) 
        {
            //      MultiLineText
            //   .
            MLT = new MultiLineText(); 
            MLT.SetTextPar(30, 30, GrW-60,GrH-60,5,Font.SIZE_LARGE,Font.STYLE_BOLD,Font.FACE_PROPORTIONAL,g, "  "); 
            isFirstRun=false;
        } 
       g.setColor(255,255,255);
       g.fillRect(0,0,GrW,GrH);
       g.setColor(0,0,0);
       g.drawRect(28, 28, GrW-56,GrH-56);
       g.setColor(0xff0000); 
       MLT.DrawMultStr(); //   .
    }

    
    protected void keyPressed( int keyCode ){
    //  . 
       if (keyCode == getKeyCode(UP))
       {
           MLT.MoveUp();
       }else if (keyCode == getKeyCode(DOWN))
       {
           MLT.MoveDown();
       }else if (keyCode == getKeyCode(LEFT))
       {
           MLT.PageUp();
       }else if (keyCode == getKeyCode(RIGHT))
       {
           MLT.PageDown();
       }
       repaint();
    }
}
 

      SetTextPar.   LongString    ,    Vector StringLines.       ,     .  ,        ,     DrawMultStr       . 
import java.util.Vector;
import javax.microedition.lcdui.*;

public class MultiLineText {
    private int x,y,w,h,fsz,fst,fty; //  
    private int hStr; // 
    private int y0; //   
    private int dy; //   
    private int textheight; //  
    private Vector StringLines; 
    private Graphics g;
    private int gx,gy,gw,gh; //  
    private String str1;
            
    public void SetTextPar(
            int x, 
            int y,
            int width,
            int height,
            int dy,
            int FontSize,
            int FontStyle,
            int FontType,
            Graphics graph,
            String LongString
            )
    {
        //   .
        this.x=x;
        this.y=y;
        this.w=width;
        this.h=height;
        this.dy=dy;
        this.fsz=FontSize;
        this.fst=FontStyle;
        this.fty=FontType;
        this.g=graph;
        //     
        gx=g.getClipX();
        gy=g.getClipY();
        gw=g.getClipWidth();
        gh=g.getClipHeight();
        //  
        g.setFont(Font.getFont(fty, fst, fsz));
        hStr=g.getFont().getHeight(); //   
        //*******************************************
        //*       *
        //*******************************************
        SringLines=null;
        StringLines =new Vector(1);
        int i0=0, //     
        int i=0, //     
        int in=0; // ,   
        int j=0; //   
        int jw=0; //   
        int imax=LongString.length(); //    
        boolean isexit=true; // 
        y0=0;
        while (isexit)
        {
            i=LongString.indexOf(" ", i0+1);
            if (i<=i0)
            {
                i=imax;
                isexit=false;
            } 
            j=g.getFont().stringWidth(LongString.substring(i0,i));
            if (jw+j<w)
            {//    
                jw=jw+j;
                i0=i;
            } else 
            {//     
                StringLines.addElement(LongString.substring(in,i0)); 
                in=i0+1;
                jw=j;
                if (j>w)
                {//       
                    i=i0;
                  while (jw>w)
                  {
                    j=0; 
                    while (j<w)
                    {
                        i=i+1;
                        j=g.getFont().stringWidth(LongString.substring(in,i));
                    
                    }
                    i=i-1;
                    j=g.getFont().stringWidth(LongString.substring(in,i));
                    StringLines.addElement(LongString.substring(in,i));
                    jw=jw-j;
                    i0=i; 
                    in=i;
                  }
                  jw=0; 
                }else{i0=i;} 
            } 
        }
        StringLines.addElement(LongString.substring(in,imax));
        textheight=StringLines.size()*hStr;     }
    
    public void DrawMultStr()
    { 
       int y1; 
       g.setClip(x, y, w, h); //   
       y1=y0;
       g.setFont(Font.getFont(fty, fst, fsz));
       for (int i=0;i<StringLines.size();i++)
       { 
           if ((y1+hStr)>0){
           g.drawString(StringLines.elementAt(i).toString(), x+1, y+y1, g.LEFT|g.TOP); 
           }
           y1=y1+hStr; 
           if (y1>h){break;}
       }
       g.setClip(gx, gy, gw, gh);
       
    }
            
... 

}

   MultiLineText