您的位置:首页 > 编程语言

J2ME应用实例——一个简单的计算器实现(附源代码)

2005-01-08 20:21 1326 查看
J2ME应用实例——一个简单的计算器实现(附源代码)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

       使用低级用户界面做了一个基于Nokia S60系列的简单计算器程序,希望对大家有所帮助。本文只包含了程序代码,如果需要图片文件和源代码请给我发邮件:cqucyf@263.net
源代码如下
// CalcMIDlet.java
package my.calc;
 

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
 

public class CalcMIDlet extends MIDlet {
  private static CalcMIDlet instance;
  private CalcCanvas calc = new CalcCanvas();
 

  /** Constructor */
  public CalcMIDlet() {
    instance = this;
  }
 

  /** Main method */
  public void startApp() {
    Display.getDisplay(this).setCurrent(calc);
  }
 

  /** Handle pausing the MIDlet */
  public void pauseApp() {
  }
 

  /** Handle destroying the MIDlet */
  public void destroyApp(boolean unconditional) {
  }
 

  /** Quit the MIDlet */
  public static void quitApp() {
    instance.destroyApp(true);
    instance.notifyDestroyed();
    instance = null;
  }
}
 

// CalcCanvas.java
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{
  /**退出按钮*/

12904
  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;
      }
    }
  }
}
欢迎大家访问我的blog:http://blog.csdn.net/mailbomb
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐