CalcCanvas.java
上传用户:hmzjsh
上传日期:2009-12-31
资源大小:5k
文件大小:6k
源码类别:

J2ME

开发平台:

Java

  1. package my.calc;
  2. import com.nokia.mid.ui.FullCanvas;
  3. import javax.microedition.lcdui.*;
  4. import java.io.*;
  5. /**
  6.  * 计算器界面
  7.  * <p>Title: 基于Nokia S60的计算器</p>
  8.  * <p>Description: </p>
  9.  * <p>Copyright: Copyright (c) 2005</p>
  10.  * <p>Company: </p>
  11.  * email:cqucyf@263.net
  12.  * @version 1.0
  13.  */
  14. public class CalcCanvas extends FullCanvas{
  15.   /**退出按钮*/
  16.   private Command cmdExit;
  17.   /**标题*/
  18.   private String title = "Calculator";
  19.   /**字体*/
  20.   private Font f;
  21.   /**显示的数字*/
  22.   private long result = 0;
  23.   /**焦点编号*/
  24.   private int num = 0;
  25.   /**焦点坐标*/
  26.   private int focusX = 5;
  27.   private int focusY = 52;
  28.   /**按钮宽度间隔*/
  29.   private int intervalWidth = 2;
  30.   private int intervalHeight = 2;
  31.   /**图片起点坐标*/
  32.   private int x = 10;
  33.   private int y = 70;
  34.   /**按钮尺寸*/
  35.   private int buttonWidth = 37;
  36.   private int buttonHeight = 28;
  37.   /**图片文件*/
  38.   private Image image = null;
  39.   /**存储控件代表的内容*/
  40.   private char[] info = {'7','8','9','/',
  41.                          '4','5','6','*',
  42.                          '1','2','3','-',
  43.                          '0','?','=','+'
  44.                         };
  45.   /**运算中的第一个数字*/
  46.   private long firstNum = 0;
  47.   /**运算中的第二个数字*/
  48.   private long secondNum = 0;
  49.   /**是否输入第一个数字,true代表已经输入,false代表未输入*/
  50.   private boolean flag = false;
  51.   /**存储按下的运算按钮的下标*/
  52.   private int func = 0;
  53.   /**默认构造方法*/
  54.   public CalcCanvas() {
  55.     try{
  56.       image = Image.createImage("/calc.png");
  57.       //System.out.println(x);
  58.     }catch(IOException e){
  59.       //ignore
  60.       System.out.println(e);
  61.     }
  62.   }
  63.   /**
  64.    * 绘制
  65.    * @param g 图形对象
  66.    */
  67.   public void paint(Graphics g) {
  68.     /**清除当前显示*/
  69.     g.setColor(255,255,255);
  70.     g.fillRect(0,0,getWidth(),getHeight());
  71.     //恢复系统颜色
  72.     g.setColor(0,0,0);
  73.     f = g.getFont();
  74.     //绘制标题
  75.     g.drawString(title,getWidth() / 2,f.getHeight() / 2,Graphics.TOP|Graphics.HCENTER);
  76.     //绘制文本框
  77.     g.drawRect(3,24,172,20);
  78.     //绘制数字
  79.     String temp = Long.toString(result);
  80.     g.drawString(temp,getWidth() -  3,30,Graphics.TOP|Graphics.RIGHT);
  81.     //绘制面板
  82.     g.drawImage(image,2,50,Graphics.TOP|Graphics.LEFT);
  83.     //绘制焦点
  84.     drawFocus(g,num);
  85.   }
  86.   /**
  87.    * 事件处理
  88.    * @param keyCode 按钮值
  89.    */
  90.   public void keyPressed(int keyCode){
  91.     //System.out.println(keyCode);
  92.     //向左移动,如果移动到右边界,则移动到下一行
  93.     if(keyCode == KEY_LEFT_ARROW){
  94.       //判断是否到达最后一个
  95.       if(num == 0){
  96.         num = 15;
  97.       }else{
  98.         num--;
  99.       }
  100.     }
  101.     //向右移动,如果移动到左边界,则移动到上一行末尾
  102.     if(keyCode == KEY_RIGHT_ARROW){
  103.       //判断是否到达第一个
  104.       if(num == 15){
  105.         num = 0;
  106.       }else{
  107.         num++;
  108.       }
  109.     }
  110.     //向上移动,如果移动到上边界,则移动到下边界对应位置
  111.     if(keyCode == KEY_UP_ARROW){
  112.       //判断是否移动到上边界,如果是则移动到下边界的对应位置
  113.       if(num - 4 < 0){
  114.         num = 15 + num - 3;
  115.       }else{
  116.         num = num - 4;
  117.       }
  118.     }
  119.     //向下移动,如果移动到下边界,则移动到上边界对应位置
  120.     if(keyCode == KEY_DOWN_ARROW){
  121.       //判断是否达到下边界,如果是则移动到上边界的对应位置
  122.       if(num + 4 > 15){
  123.         num = num + 3 - 15;
  124.       }else{
  125.         num = num + 4;
  126.       }
  127.     }
  128.     //确定按钮
  129.     if(keyCode == -5){
  130.       //根据选择按钮的不同进行操作
  131.       action();
  132.     }
  133.     //System.out.println("num : " + num);
  134.     //绘图
  135.     repaint();
  136.   }
  137.   /**
  138.    * 绘制焦点矩形
  139.    * @param g 图形对象
  140.    * @param num 焦点编号
  141.    */
  142.   private void drawFocus(Graphics g,int num){
  143.     //设置绘制颜色为红色
  144.     g.setColor(255,0,0);
  145.     //设置焦点的X和Y坐标
  146.     setXandYByNum(num);
  147.     //绘制选择框
  148.     g.drawRect(focusX,focusY,buttonWidth,buttonHeight);
  149.   }
  150.   /**
  151.    * 根据焦点编号,设置焦点的X和Y坐标
  152.    * @param num 焦点编号
  153.    */
  154.   private void setXandYByNum(int num){
  155.     focusX = 5 + (num % 4) * (buttonWidth + intervalWidth);
  156.     focusY = 52 + (num / 4) * (buttonHeight + intervalHeight);
  157.   }
  158.   /**
  159.    * 在用户按下确定按钮以后,根据选择按钮的不同进行操作
  160.    */
  161.   private void action(){
  162.     //判断焦点按钮是否为数字
  163.     if((num >=0 && num < 3) || (num > 3 && num < 7) || (num > 7 && num < 11) || (num == 12)){
  164.       //如果是数字,则将原数字乘以10,再加上现在的数字
  165.       result = result * 10 + (info[num] - '0');
  166.     }
  167.     //如果按下的是负号,则求当前数字的负数
  168.     if(num == 13){
  169.       result = -result;
  170.     }
  171.     //判断第一个数字是否输入
  172.     if(flag == true){
  173.       secondNum = result;
  174.       //处理功能按钮
  175.       //按下=按钮,或者按下运算按钮时,进行运算
  176.       if(num == 14 || (num % 4 == 3)){
  177.         //根据运算按钮进行运算
  178.         if(func == 3){
  179.           //除法运算
  180.           result = firstNum / secondNum;
  181.         }else if(func == 7){
  182.           //乘法运算
  183.           result = firstNum * secondNum;
  184.         }else if(func == 11){
  185.           //减法运算
  186.           result = firstNum - secondNum;
  187.         }else if(func == 15){
  188.           //加法运算
  189.           result = firstNum + secondNum;
  190.         }
  191.         if(num == 14){
  192.           //将运算结果赋给第一个数字
  193.           firstNum = result;
  194.           //将标志修改为false
  195.           flag = false;
  196.         }else{
  197.           //记录运算按钮
  198.           func = num;
  199.           //将运算结果赋给第一个数字
  200.           firstNum = result;
  201.           //将显示清零
  202.           result = 0;
  203.         }
  204.       }
  205.     }else{
  206.       //将当前值赋给第一个数字
  207.       firstNum = result;
  208.       //判断是否按下运算按钮,并存储按下的运算按钮
  209.       if(num % 4 == 3){
  210.         func = num;
  211.         //设置第一个数字已输入,并将显示清零
  212.         flag = true;
  213.         result = 0;
  214.       }
  215.     }
  216.   }
  217. }