现在的位置: 首页 > 综合 > 正文

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

2013年10月07日 ⁄ 综合 ⁄ 共 4928字 ⁄ 字号 评论关闭

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

 

       使用低级用户界面做了一个基于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{

  /**退出按钮*/

  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);

    //设置焦点的XY坐标

    setXandYByNum(num);

    //绘制选择框

    g.drawRect(focusX,focusY,buttonWidth,buttonHeight);

  }

  /**

   * 根据焦点编号,设置焦点的XY坐标

   * @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;

      }

    }

  }

}

抱歉!评论已关闭.