欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计可组装的j2me UI(三) TextBox UINokia框架 

程序员文章站 2022-05-29 08:28:30
...
     自己实现操作Canvas,很大部分是对文字的显示以及排版操作。而对字体的定义则每个厂商都有自己的规范,必然nokia定义了大,中,小字体。而我在其他手机上只有一种字体,所以无论你怎么样定义字体的大小都只有一种效果,这样的话。你可能要在程序中自己进行判断,然后在显示出来。要不然的话,则写出的程序在各个机型上显示的效果会有一些不同。
     下面让我们来设计可以滚动的TextBox.
     首先继承Part(UI的第一篇文章有给出代码)
    
public class TextBox extends Part {
     	/** 文本的行数 */
	private int numOfEls;
	
	/**
	 * 此页面最多显示得行数
	 */
	private int maxNum;
	
	private int pillarHeight;

	/** 开始索引 * */
	private int startIndex;
       /**
	 * 文本的内容
	 */
	private char [] textChars;
	
	/**
	 * 文本切割后得内容
	 */
	private String[] textNum;
	
	
	private String text;

        public void setString(String text) {
		
			 
		this.text = text;
	 	this.textChars = text.toCharArray();
	 	skipContent();
	 	//numOfEls = textChars.length;
	}
        /**
	 * 分割字符传.并处理pillar的高度,最主要的方法。
         * 通过屏幕的高,宽,以及字体的体型进行文本出来。并把处理后的文本保存在一个Vector中,以后绘制出来就容易多了
	 *
	 */
	private void skipContent(){
		
		this.numOfEls = FontUtil.siptRow(this.contentStyle.font,
				viewContent[WIDTH],text);
		
		int charWidth = viewContent[X]+ 2;
		int charHeight = viewContent[Y];
		int h;
		if(numOfEls>this.maxNum){
			h = (viewContent[WIDTH]-18);
		}else{
			h = (viewContent[WIDTH]-12);
		}
		StringBuffer sb = new StringBuffer();
		Vector ve = new Vector();
		for(int i=0 ; i < this.textChars.length; i++){
		   sb.append(textChars[i]);
			 
			charWidth = charWidth + contentStyle.font.charWidth(textChars[i]);
			
			
			if(charWidth>h){
				charHeight = charHeight + contentStyle.font.getHeight()  ;
				charWidth = viewContent[X] + 2;
				ve.addElement(sb.toString());
				log.debug(sb);
				sb = null;
				sb = new StringBuffer();
				
			} 
		}
		ve.addElement(sb.toString());	
		log.debug(sb);
		textNum = new String[ve.size()];
		ve.copyInto(this.textNum);
		ve.removeAllElements();
		ve = null;
	
		//获取最大的数组值
		maxNum = viewContent[HEIGHT]/(this.contentStyle.font.getHeight() ) ;
		this.numOfEls = this.textNum.length;
		this.pillarHeight = numOfEls > maxNum ? viewContent[HEIGHT]/(numOfEls-maxNum +1):0;
		
		log.debug("MaxNum=" + maxNum); 
		log.debug("numOfEls=" + numOfEls); 
		
		
	}

/**
	 * 绘制文本的内容,自动实现,状态条的显示等
	 * @param g
	 */
	private void paintContent(Graphics g) {
		this.contentStyle.setFontColor(g);
		 
		int charWidth = viewContent[X]+ 2;
		int charHeight = viewContent[Y];
		int size = maxNum > this.numOfEls? numOfEls:maxNum;
		log.debug(startIndex);
		for(int i=startIndex ; i < size + startIndex; i++){
			g.drawString(this.textNum[i],charWidth,charHeight,Graphics.TOP | Graphics.LEFT);
			charHeight = charHeight + contentStyle.font.getHeight() ;			
		}
		
		paintPillar(viewContent[WIDTH]-pillarWidth-4, viewContent[Y],g);
		
	}
	
	private void paintPillar(int x,int y,Graphics g){
		if (maxNum > this.numOfEls)
			return; 
		pillar.paint(x,y+(startIndex * pillarHeight),viewContent[WIDTH],this.pillarHeight,g);
	}




以上代码是基本框架。思路就这样。实践起来也不困难。
相关标签: UI Nokia 框架