CalcCanvas.java
上传用户:hmzjsh
上传日期:2009-12-31
资源大小:5k
文件大小:6k
- package my.calc;
- import com.nokia.mid.ui.FullCanvas;
- import javax.microedition.lcdui.*;
- import java.io.*;
- /**
- * 计算器界面
- * <p>Title: 基于Nokia S60的计算器</p>
- * <p>Description: </p>
- * <p>Copyright: Copyright (c) 2005</p>
- * <p>Company: </p>
- * email:cqucyf@263.net
- * @version 1.0
- */
- public class CalcCanvas extends FullCanvas{
- /**退出按钮*/
- private Command cmdExit;
- /**标题*/
- private String title = "Calculator";
- /**字体*/
- private Font f;
- /**显示的数字*/
- private long result = 0;
- /**焦点编号*/
- private int num = 0;
- /**焦点坐标*/
- private int focusX = 5;
- private int focusY = 52;
- /**按钮宽度间隔*/
- private int intervalWidth = 2;
- private int intervalHeight = 2;
- /**图片起点坐标*/
- private int x = 10;
- private int y = 70;
- /**按钮尺寸*/
- private int buttonWidth = 37;
- private int buttonHeight = 28;
- /**图片文件*/
- private Image image = null;
- /**存储控件代表的内容*/
- private char[] info = {'7','8','9','/',
- '4','5','6','*',
- '1','2','3','-',
- '0','?','=','+'
- };
- /**运算中的第一个数字*/
- private long firstNum = 0;
- /**运算中的第二个数字*/
- private long secondNum = 0;
- /**是否输入第一个数字,true代表已经输入,false代表未输入*/
- private boolean flag = false;
- /**存储按下的运算按钮的下标*/
- private int func = 0;
- /**默认构造方法*/
- public CalcCanvas() {
- try{
- image = Image.createImage("/calc.png");
- //System.out.println(x);
- }catch(IOException e){
- //ignore
- System.out.println(e);
- }
- }
- /**
- * 绘制
- * @param g 图形对象
- */
- public void paint(Graphics g) {
- /**清除当前显示*/
- g.setColor(255,255,255);
- g.fillRect(0,0,getWidth(),getHeight());
- //恢复系统颜色
- g.setColor(0,0,0);
- f = g.getFont();
- //绘制标题
- g.drawString(title,getWidth() / 2,f.getHeight() / 2,Graphics.TOP|Graphics.HCENTER);
- //绘制文本框
- g.drawRect(3,24,172,20);
- //绘制数字
- String temp = Long.toString(result);
- g.drawString(temp,getWidth() - 3,30,Graphics.TOP|Graphics.RIGHT);
- //绘制面板
- g.drawImage(image,2,50,Graphics.TOP|Graphics.LEFT);
- //绘制焦点
- drawFocus(g,num);
- }
- /**
- * 事件处理
- * @param keyCode 按钮值
- */
- public void keyPressed(int keyCode){
- //System.out.println(keyCode);
- //向左移动,如果移动到右边界,则移动到下一行
- if(keyCode == KEY_LEFT_ARROW){
- //判断是否到达最后一个
- if(num == 0){
- num = 15;
- }else{
- num--;
- }
- }
- //向右移动,如果移动到左边界,则移动到上一行末尾
- if(keyCode == KEY_RIGHT_ARROW){
- //判断是否到达第一个
- if(num == 15){
- num = 0;
- }else{
- num++;
- }
- }
- //向上移动,如果移动到上边界,则移动到下边界对应位置
- if(keyCode == KEY_UP_ARROW){
- //判断是否移动到上边界,如果是则移动到下边界的对应位置
- if(num - 4 < 0){
- num = 15 + num - 3;
- }else{
- num = num - 4;
- }
- }
- //向下移动,如果移动到下边界,则移动到上边界对应位置
- if(keyCode == KEY_DOWN_ARROW){
- //判断是否达到下边界,如果是则移动到上边界的对应位置
- if(num + 4 > 15){
- num = num + 3 - 15;
- }else{
- num = num + 4;
- }
- }
- //确定按钮
- if(keyCode == -5){
- //根据选择按钮的不同进行操作
- action();
- }
- //System.out.println("num : " + num);
- //绘图
- repaint();
- }
- /**
- * 绘制焦点矩形
- * @param g 图形对象
- * @param num 焦点编号
- */
- private void drawFocus(Graphics g,int num){
- //设置绘制颜色为红色
- g.setColor(255,0,0);
- //设置焦点的X和Y坐标
- setXandYByNum(num);
- //绘制选择框
- g.drawRect(focusX,focusY,buttonWidth,buttonHeight);
- }
- /**
- * 根据焦点编号,设置焦点的X和Y坐标
- * @param num 焦点编号
- */
- private void setXandYByNum(int num){
- focusX = 5 + (num % 4) * (buttonWidth + intervalWidth);
- focusY = 52 + (num / 4) * (buttonHeight + intervalHeight);
- }
- /**
- * 在用户按下确定按钮以后,根据选择按钮的不同进行操作
- */
- private void action(){
- //判断焦点按钮是否为数字
- if((num >=0 && num < 3) || (num > 3 && num < 7) || (num > 7 && num < 11) || (num == 12)){
- //如果是数字,则将原数字乘以10,再加上现在的数字
- result = result * 10 + (info[num] - '0');
- }
- //如果按下的是负号,则求当前数字的负数
- if(num == 13){
- result = -result;
- }
- //判断第一个数字是否输入
- if(flag == true){
- secondNum = result;
- //处理功能按钮
- //按下=按钮,或者按下运算按钮时,进行运算
- if(num == 14 || (num % 4 == 3)){
- //根据运算按钮进行运算
- if(func == 3){
- //除法运算
- result = firstNum / secondNum;
- }else if(func == 7){
- //乘法运算
- result = firstNum * secondNum;
- }else if(func == 11){
- //减法运算
- result = firstNum - secondNum;
- }else if(func == 15){
- //加法运算
- result = firstNum + secondNum;
- }
- if(num == 14){
- //将运算结果赋给第一个数字
- firstNum = result;
- //将标志修改为false
- flag = false;
- }else{
- //记录运算按钮
- func = num;
- //将运算结果赋给第一个数字
- firstNum = result;
- //将显示清零
- result = 0;
- }
- }
- }else{
- //将当前值赋给第一个数字
- firstNum = result;
- //判断是否按下运算按钮,并存储按下的运算按钮
- if(num % 4 == 3){
- func = num;
- //设置第一个数字已输入,并将显示清零
- flag = true;
- result = 0;
- }
- }
- }
- }