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

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

2005-01-05 18:42 1036 查看
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);
//设置焦点的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐