import javax.microedition.lcdui.*; /** * 计算器界面和逻辑 */ public class CalcCanvas extends Canvas { /**状态值*/ int status; /**输入第一个数字状态*/ final int INPUT_FIRST = 1; /**输入第二个数字状态*/ final int INPUT_SECOND = 3; /**输入运算符号状态*/ final int INPUT_FLAG = 2; /**绘制内容右下角的x坐标*/ int x = 150; /**绘制内容右下角的x坐标*/ int y = 160; /**行高*/ int lineHeight = 20; /**第一个数字的值*/ int firstNum = 0; /**第二个数字的值*/ int secondNum = 0; /**运算符号,0无意义,1代表+,2代表减、3乘4除*/ int flag = 0; /**屏幕宽度*/ int w; /**屏幕高度*/ int h; /**运算符数组*/ String[] sFlag = {"+","-","*","/"}; public CalcCanvas(){ //初始化状态为输入第一个数字状态 status = INPUT_FIRST; //设置全屏幕 setFullScreenMode(true); //获得屏幕高度和宽度 h = getHeight(); w = getWidth(); } protected void paint(Graphics g) { //清屏 g.setColor(0xffffff); g.fillRect(0,0,w,h); g.setColor(0);
//绘制按钮文字 g.drawString("=", w,h, Graphics.RIGHT | Graphics.BOTTOM); g.drawString("C", 0,h, Graphics.LEFT | Graphics.BOTTOM); //根据状态值确定绘制的内容和位置 switch(status){ case INPUT_FIRST: //绘制第一个数字 g.drawString("" + firstNum, x, y, Graphics.RIGHT | Graphics.BOTTOM); break; case INPUT_FLAG: //绘制第一个数字 g.drawString("" + firstNum, x, y - lineHeight, Graphics.RIGHT | Graphics.BOTTOM); //绘制运算符号 g.drawString(sFlag[flag - 1], x, y, Graphics.RIGHT | Graphics.BOTTOM); break; case INPUT_SECOND: //绘制第一个数字 g.drawString("" + firstNum, x, y - 2 * lineHeight, Graphics.RIGHT | Graphics.BOTTOM); //绘制运算符号 g.drawString(sFlag[flag - 1], x, y - lineHeight, Graphics.RIGHT | Graphics.BOTTOM); //绘制第二个数字 g.drawString("" + secondNum, x, y, Graphics.RIGHT | Graphics.BOTTOM); break; } } public void keyPressed(int keyCode){ //按钮C的处理 if(keyCode == -6){ //左软键 //根据状态值确定清除的内容 switch(status){ case INPUT_FIRST: firstNum /=10; break; case INPUT_FLAG: //切换到输入第一个数字状态 status = INPUT_FIRST; //清除运算符号 flag = 0; break; case INPUT_SECOND: //清除第二个数字 secondNum /= 10; //如果第二个数字为0,则切换到输入运算符状态 if(secondNum == 0){ status = INPUT_FLAG; } break; } }
if(keyCode == -7){ //按钮=的处理 //如果处于输入第二个数字状态,且第二个数字不是0 if((status == INPUT_SECOND) && (secondNum != 0)){ //计算结果,并把结果赋值给第一个数字 switch(flag){ case 1: firstNum += secondNum; break; case 2: firstNum -= secondNum; break; case 3: firstNum *= secondNum; break; case 4: firstNum /= secondNum; break; } //恢复状态到输入第一个数字状态 status = INPUT_FIRST; //清除运算符和第二个数字 flag = 0; secondNum = 0; } }
//输入的是数字键 if((keyCode >= KEY_NUM0) && (keyCode <= KEY_NUM9)){ //如果是输入第一个数字状态 switch(status){ case INPUT_FIRST: firstNum = firstNum * 10 + (keyCode - KEY_NUM0); break; case INPUT_SECOND: secondNum = secondNum * 10 + (keyCode - KEY_NUM0); break; case INPUT_FLAG: //切换到输入第二个数字状态 status = INPUT_SECOND; //记忆输入的数字 secondNum = secondNum * 10 + (keyCode - KEY_NUM0); break; } }
//按星号实现输入运算符号 if(keyCode == KEY_STAR){ //如果当前是输入第一个数字状态或输入运算符状态 if((status == INPUT_FIRST) || (status == INPUT_FLAG)){ //输入运算符 if(flag < 4){ flag++; }else{ flag = 1; } //设置状态为输入运算符状态 status = INPUT_FLAG; } } //重绘 repaint(); } } |