www.pudn.com > busStop_java_srccode.rar > LiteralInput.java


/*********************************************************************** 
 * 
 * 
 *		软件:公交路线选择软件 
 *		作者:李蛟 
 *		学校:浙江工业大学计本 
 *		邮箱:joke_leee@163.com 
 * 
 *		说明:本软件是用于查询市公交路线选择的软件。 
 *			  本软件在对相应文件进行修改后可用于任何类似各个城市的公交路线等的查询。 
 *			  除了用于商业需经得本人同意外,你可以学习使用甚至修改。 
 *			  第一次发布,难免很多的错误和不足,欢迎有兴趣的朋友批评指正,发现问 
 *			  题请与本人联系,咱们可以交流交流! 
 * 
 * 
 ***********************************************************************/ 
 
 
/*********************************************************************** 
 * 
 *此文件对用于输入法的显示,操作控制等 
 *即:对canvas的绘图操作 
 *主要得到输入的拼音,并查询得到汉字字符串 
 * 
 ***********************************************************************/ 
import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 
import java.util.Calendar; 
 
public class LiteralInput extends javax.microedition.lcdui.Canvas 
{ 
	public LiteralInput() 
	{ 
		init(); 
		reset(); 
	} 
	 
	public String getOutputString() 
	{ 
		if(m_outputLen==0)  
			return null; 
		else  
			return new String(m_output,0,m_outputLen);	 
	} 
	 
	protected void paint(javax.microedition.lcdui.Graphics g) 
	{ 
//		if(!m_hasDrawFirst) 
//		{ 
			m_hasDrawFirst=true; 
			//清屏 
			g.setColor(0xffffff); 
			g.fillRect(0, 0, m_width, m_height); 
			//显示框 
			//g.setColor(0xff0000); 
			//g.drawRect(0, m_fontHeight+2, m_width-1, (m_fontHeight+2)*2); 
			//输入框 
			g.setColor(0x0000ff); 
			g.drawRect(0, m_height-(m_fontHeight+2)*3-1, m_width-1, (m_fontHeight+2)*3); 
			g.setColor(0xff00ff); 
			g.drawLine(1, m_height-(m_fontHeight+2)*1-1, m_width-2,  m_height-(m_fontHeight+2)*1-1); 
 
			g.setColor(0x000000); 
			//g.drawString("阿嫂", (m_fontWidth+2), m_height-(m_fontHeight+2)*3,Graphics.TOP|Graphics.LEFT); 
//		} 
//		if(!m_hasDrawOutput) 
//		{ 
			paintOutput(g); 
//		} 
//		if(!m_hasDrawChoose) 
//		{ 
			paintChoose(g); 
//		} 
//		if(!m_hasDrawInput) 
//		{ 
			paintKeyInput(g); 
//		} 
		if(!m_isInput)paintFlag(g); 
	} 
	 
	private void init() 
	{ 
		m_dateBefore=Calendar.getInstance().getTime().getTime(); 
		//得到系统信息 
		m_height=getHeight(); 
		m_width=getWidth(); 
		Font font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM); 
		m_fontHeight=font.getHeight(); 
		m_fontWidth=font.charWidth('爱'); 
		font=null; 
		m_wordNumPerLine=m_width/m_fontWidth; 
	} 
	 
	/*开始输入时清空所有*/ 
	private void reset() 
	{ 
		m_outputLen=0; 
		m_chooseChars=null; 
		newInput(); 
		 
		repaint(); 
	} 
 
	protected void keyPressed(int keyCode) 
	{ 
		keyProcess(keyCode); 
	} 
		 
	/*用于输出字符串的重画*/ 
	private void paintOutput() 
	{ 
		m_hasDrawOutput=false;	 
		repaint();	 
	} 
	private void paintOutput(Graphics g) 
	{ 
		m_hasDrawOutput=true; 
		if(m_outputLen < m_wordNumPerLine) 
		{ 
			g.drawChars(m_output, 0, m_outputLen, 0, 0, Graphics.TOP|Graphics.LEFT); 
		}else 
		{ 
			g.drawChars(m_output, 0, m_wordNumPerLine, 0, 0, Graphics.TOP|Graphics.LEFT); 
			g.drawChars(m_output, m_wordNumPerLine, m_outputLen-m_wordNumPerLine, 0, m_fontHeight-1, Graphics.TOP|Graphics.LEFT); 
		} 
	} 
	 
	/*用于选择字符的重画*/ 
	private void paintChoose() 
	{ 
		//System.out.print("             "); 
		//System.out.println(m_chooseChars); 
		m_hasDrawChoose=false;	 
		repaint();	 
	} 
	private void paintChoose(Graphics g) 
	{ 
		m_hasDrawChoose=true; 
		if(m_chooseChars==null) return; 
		int i,j; 
		for(i=m_pageChoose*10,j=0; iCOUNT_PER_KEY.length) return false; 
		//同一按键 
		if(m_keyBefore==key) 
		{ 
			m_inputCount++; 
			//同一按键,按的次数太多,转为第一个 
			if(m_inputCount>=COUNT_PER_KEY[key]) m_inputCount=0; 
			 
			m_dateNow=Calendar.getInstance().getTime().getTime(); 
			//在给定时间范围内 
			if((m_dateNow-m_dateBefore) < DATEINTEVAL) 
			{ 
				//修改原来的字母 
				m_input[m_inputLen-1]=(char)(LETTER_ON_KEY[key]+m_inputCount); 
				m_dateBefore=m_dateNow; 
				return true; 
			}else//不在给定时间范围内 
			{ 
								 
				m_dateBefore=m_dateNow; 
				m_inputCount=0; 
				//可能超过长度 
				if(m_inputLen>=MAXINPUTLEN) return false; 
				//添加字母 
				m_input[m_inputLen]=(char)(LETTER_ON_KEY[key]); 
				m_inputLen++; 
				return true; 
			}			 
		} 
		 
		m_dateBefore=Calendar.getInstance().getTime().getTime(); 
		//不同按键 
		m_keyBefore=key; 
		m_inputCount=0; 
		//可添加时 
		if(m_inputLen0) 
		{ 
			m_inputLen--; 
			paintKeyInput(); 
		} 
	} 
	 
	/*删除一个输出文字*/ 
	private void clearOutputWord() 
	{ 
		if(m_inputLen==0 && m_outputLen>0) 
		{ 
			m_outputLen--; 
			paintOutput(); 
		} 
	} 
 
	/*选择一个汉字后,清除一些东西*/ 
	private void newInput() 
	{ 
		m_inputLen=0; 
		m_inputCount=0; 
		m_isInput=true; 
		m_keyBefore=-1; 
		m_pageChoose=0; 
	} 
 
	/*选择汉字 
	 *key Canvas.KEY_NUM0~Canvas.KEY_NUM9 
	 **/ 
	private void chooseWord(int key) 
	{ 
		if(m_outputLen>MAXOUTPUTLEN) return; 
		//选择第几个汉字 
		key-=Canvas.KEY_NUM0;	key+=9; 	key%=10; 
		m_output[m_outputLen++]=m_chooseChars.charAt(m_pageChoose*10+key); 
		newInput(); 
		//paintChoose(); 
		paintKeyInput(); 
	} 
	 
	/*处理按键输入*/ 
	private void keyProcess(int key) 
	{	 
		switch(key) 
		{ 
			//处理取消键 
			case LEFT: 
			case Canvas.LEFT: 
			case CLEAR: 
				clearOutputWord(); 
				clearInputChar(); 
				break; 
				 
			case UP: 
			case Canvas.UP: 
				//向上翻页 
				if(m_chooseChars!=null && m_pageChoose > 0) 
				{ 
					m_pageChoose--; 
					paintChoose(); 
				}			 
				break; 
				 
			case DOWN: 
			case Canvas.DOWN: 
				//向下翻页 
				if(m_chooseChars!=null && m_chooseChars.length()>(10*(m_pageChoose+1))) 
				{ 
					m_pageChoose++; 
					paintChoose(); 
				} 
				break; 
								 
			case RIGHT: 
			case Canvas.RIGHT: 
				m_keyBefore=-1; 
				break; 
				 
			case FIRE: 
			case Canvas.FIRE: 
				break; 
				 
			case DIAL: 
				break; 
				 
			case HANG: 
				break; 
				 
			case Canvas.KEY_NUM0: 
				if(!m_isInput)	 
				{ 
					m_isInput=true; 
					chooseWord(key); 
				} 
				break; 
				 
			case Canvas.KEY_NUM1: 
			case Canvas.KEY_STAR: 
				//无输入时 
				if(m_inputLen<=0)return; 
				//原为输入时,变成选择状态	 
				if(m_isInput)	 
				{ 
					m_isInput=false; 
					paintFlag(); 
				}else 
				{ 
					m_isInput=true; 
					chooseWord(key); 
				} 
				break; 
				 
			//输入可能是字母,也可能是在选字状态 
			case Canvas.KEY_NUM2:	 
			case Canvas.KEY_NUM3:	 
			case Canvas.KEY_NUM4:	 
			case Canvas.KEY_NUM5:	 
			case Canvas.KEY_NUM6:	 
			case Canvas.KEY_NUM7:	 
			case Canvas.KEY_NUM8:	 
			case Canvas.KEY_NUM9: 
				if(!m_isInput)	 
				{ 
					m_isInput=true; 
					chooseWord(key); 
				}else if(processChar(key-Canvas.KEY_NUM2)) 
				{ 
					//System.out.println(m_chooseChars); 
					paintKeyInput(); 
				} 
				break; 
				 
			case Canvas.KEY_POUND:	 
				break; 
		} 
	} 
	 
	//返回拼音的字符串 
	private final String getInputString() 
	{ 
		return new String(m_input, 0, m_inputLen); 
	} 
	 
	/*让pinyin早点载入*/ 
	public void preRun() 
	{ 
		PinYin.getWords("a"); 
	} 
/**************ATTRIBUTE*********************/	 
	private static final int MAXOUTPUTLEN=16; 
	/*输出框中的文字,长度*/ 
	private char []m_output=new char[MAXOUTPUTLEN+1]; 
	private int m_outputLen=0; 
	 
	private static final int MAXINPUTLEN=6; 
	/*输入的字母,长度*/ 
	private char []m_input=new char[MAXINPUTLEN+1]; 
	private int m_inputLen=0; 
	 
	//选字时 所供选择的字符串 
	private String m_chooseChars;	 
	 
	 
	/*未输入字符状态,还是选字状态*/ 
	private boolean m_isInput=true; 
	/*连续按一个键时的次数--决定一个键上的那个字母*/ 
	private int m_inputCount=0; 
	/*原来的按键*/ 
	private int m_keyBefore=-1; 
	/*时间决定同一个按键是不是显示不同字母*/ 
	private long m_dateBefore, m_dateNow=0; 
	/*定义时间长度*/ 
	private static final long DATEINTEVAL=600; 
	 
	private int m_width, m_height; 
	private int m_fontWidth, m_fontHeight; 
	//一行的文字数 
	private int m_wordNumPerLine; 
	 
	/*当前可选汉字的页数*/ 
	private int m_pageChoose=0; 
	 
	private boolean m_hasDrawOutput=false,m_hasDrawChoose=false,m_hasDrawInput=false,m_hasDrawFirst=false; 
	 
	//定义按键 
	private static final int UP=-1, DOWN=-2, LEFT=-3, RIGHT=-4, FIRE=-5, CLEAR=-8, DIAL=-10, HANG=-11; 
	private static final int []COUNT_PER_KEY={3,3,3,3,3,4,3,4}; 
	private static final char []LETTER_ON_KEY={'a','d','g','j','m','p','t','w'}; 
}