2、概要设计
3、详细设计
4、测试分析
5、总结
6、参考文献
【前言】
Java不依赖平台的特点使得它受到广泛的关注,Java已成为网络时代最重要的语言之一。Java 语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。目前,很多新的技术领域都涉及Java语言,国内外许多大学已将Java语言列入了本科教学计划,掌握Java已经成为共识。
本次课程设计就是利用java语言来编写简单的计算器,能进行加、减、乘、除四则运算,下面给出了该设计的理论分析和具体步骤。
一、摘要
本计算器可以进行简单的四则运算(加、减、乘、除),但仅限于十进制下。“Backspace”按钮表示退格,“CE”按钮表示清除当前文本框内的数据,“C”按钮表示清除文本框内数据,同时var、answer清零。该程序可在JCreator环境下直接运行。
二、概要设计
1、自定义说明
(1)类名:Calculator
作用:主类
继承的父类:JFrame类
实现的接口:ActionListener类
public class Calculator extends JFrame implements ActionListener
{
private static String[] btnTexts = {"0
//定义数组bstTexts来存放计算器上的各个按钮
Button button[] = new Button[16];
Button BkButton,CeButton,CButton,EqButton;
boolean clickable; //控制当前能否按键
double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd)
short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算
DecimalFormat df; //设置数据输出精度
private JTextField displayField = new JTextField(" "); //计算结果显示区
public Calculator()
{
………
}
public void actionPerformed(ActionEvent event)
{
………
}
}
(2)方法名:Calculator
作用:设置窗体布局
public Calculator()
{
//Frame frame = new Frame("Calculator");
super("Calculator"); //显示主窗口标题“Calculator”
df = new DecimalFormat("0.00000000"); //设置数据输出精度(对于double型值)
BkButton = new Button("Backspace");
BkButton.setForeground(Color.red);
CeButton = new Button("CE");
tForeground(Color.red);
CButton = new Button("C");
CButton.setForeground(Color.red);
EqButton = new Button("=");
EqButton.setForeground(Color.red); //将“Backspace”、“CE”、”C”、“=”显示为红色
BkButton.addActionListener(this);
nListener(this);
CButton.addActionListener(this);
EqButton.addActionListener(this);
displayField.setHorizontalAlignment(JTextField.RIGHT); //将计算结果显示在displayField的右面
JPanel p1 = new JPanel(new FlowLayout()); //以FlowLayout布局p1
p1.add(BkButton);
p1.add(CeButton);
p1.add(CButton);
p1.add(EqButton); //设置四个按钮:"Backspace
JPanel p2 = new JPanel(new GridLayout(2,1)); //以GridLayout布局p2
p2.add(displayField);
p2.add(p1); //加入显示结果的JTextField和p1
JPanel p3 = new JPanel(new GridLayout(4,4)); //以GridLayout布局p3
for(int i = 0;i < btnTexts.length;i++)
{
button[i] = new Button(btnTexts[i]); //将数组btnTexts[]的值赋给数组button[]
button[i].setForeground(Color.blue); //组件button的前景色显示蓝色
p3.add(button[i]);
button[i].addActionListener(this);
}
Container cp = this.getContentPane(); //采用默认的BorderLayout布局cp
cp.add(p2,BorderLayout.NORTH);
R);
}
(3)方法名:actionPerformed
作用:设置各个按钮的行为
public void actionPerformed(ActionEvent event)
{
boolean sign = false; //判断是否是double型数参与运算,是为true,不是为false
Object temp = event.getSource();
try
{
for (int i = 0; i <= 9; i++) //如果按下数据按钮,将按下的按钮代表的数据插入的当前文本框字符串之后
if (temp == button[i] && clickable == true)
displayField.setText(displayField.getText() + Integer.toString(i));
//按下'.'按钮时,判断当前文本框内字符串中含不含'.',如果已含,则不允许再插入'.'
if (temp == button[14] && clickable == true)
{
……….
}
if ( (temp == button[10] || temp == button[11] || temp == button[12] || temp == button[13]) && clickable == true)
{
//'+'操作
if (temp == button[10])
{
…………
}
//'-'操作
if (temp == button[11])
{
…………
}
//'*'操作
if (temp == button[12])
{
…………
}
//'/'操作
if (temp == button[13])
{
…………
}
//'='操作
if (temp == EqButton && clickable == true)
{
…………
}
//按下'+/-'按钮时处理
if (temp == button[15] && clickable == true)
{
…………
}
//按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除
if (temp == BkButton && clickable == true)
{
…………
}
//按下'CE'按钮,将当前文本框内数据清除
if (temp == CeButton)
{
………
}
//按下'C'按钮,文本框内数据清除,同时var,answer清0
if (temp == CButton)
{
………
}
}
//输入中如果有操作非法,比如按下两次'+',捕获异常
catch (Exception e)
{
displayField.setText("操作非法");
clickable = false;
}
2、界面设计
下图为该程序运行时的界面截图:
三、详细设计
以下为该程序的主要代码:
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
imalFormat;
public class Calculator extends JFrame implements ActionListener
{
private static String[] btnTexts = {"0
Button button[] = new Button[16];
Button BkButton,CeButton,CButton,EqButton;
boolean clickable; //控制当前能否按键
double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd)
short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算
DecimalFormat df; //设置数据输出精度
private JTextField displayField = new JTextField(" ");//计算结果显示区
public Calculator()
{
super("Calculator"); //显示主窗口标题“Calculator”
df = new DecimalFormat("0.00000000"); //设置数据输出精度(对于double型值)
BkButton = new Button("Backspace");
BkButton.setForeground(Color.red);
CeButton = new Button("CE");
CeButton.setForeground(Color.red);
CButton = new Button("C");
CButton.setForeground(Color.red);
EqButton = new Button("=");
EqButton.setForeground(Color.red); //将“Backspace”、“CE”、”C”、“=”显示为红色
BkButton.addActionListener(this);
CeButton.addActionListener(this);
CButton.addActionListener(this);
EqButton.addActionListener(this);
displayField.setHorizontalAlignment(JTextField.RIGHT); //将计算结果显示在displayField的右面
JPanel p1 = new JPanel(new FlowLayout()); //以FlowLayout布局p1
p1.add(BkButton);
p1.add(CeButton);
p1.add(CButton);
p1.add(EqButton); //设置三个按钮:"Backspace
JPanel p2 = new JPanel(new GridLayout(2,1)); //以GridLayout布局p2
p2.add(displayField);
p2.add(p1); //加入显示结果的JTextField和p1
JPanel p3 = new JPanel(new GridLayout(4,4)); //以GridLayout布局p3
for(int i = 0;i < btnTexts.length;i++)
{
button[i] = new Button(btnTexts[i]); //将数组btnTexts[]的值赋给数组button[]
button[i].setForeground(Color.blue); //组件button的前景色示蓝色
p3.add(button[i]);
button[i].addActionListener(this);
}
Container cp = this.getContentPane(); //采用默认的BorderLayout布局cp
cp.add(p2,BorderLayout.NORTH);
cp.add(p3,BorderLayout.CENTER);
}
//设置各个按钮行为
public void actionPerformed(ActionEvent event)
{
boolean sign = false; //判断是否是double型数参与运算,是为true,不是为false
Object temp = event.getSource();
try
{
for (int i = 0; i <= 9; i++) //如果按下数据按钮,将按下的按钮代表的数据插入的当前文本框字符串之后
if (temp == button[i] && clickable == true)
displayField.setText(displayField.getText() + Integer.toString(i));
//按下'.'按钮时,判断当前文本框内字符串中含不含'.',如果已含,则不允许再插入'.'
if (temp == button[14] && clickable == true)
{
boolean isDot = false;
if (displayField.getText().length() == 0)
isDot = true;
for (int i = 0; i < displayField.getText().length(); i++)
if ('.' == displayField.getText().charAt(i))
{
isDot = true;
break;
}
if (isDot == false)
displayField.setText(displayField.getText() + ".");
}
if ( (temp == button[10] || temp == button[11] || temp == button[12] || temp == button[13]) && clickable == true)
{
//'+'操作
if (temp == button[10])
{
switch (prekey)
{
case 0:
answerd += Double.parseDouble(displayField.getText());
break;
case 1:
answerd -= Double.parseDouble(displayField.getText());
break;
case 2:
answerd *= Double.parseDouble(displayField.getText());
break;
case 3:
if (Double.parseDouble(displayField.getText()) == 0)
{
displayField.setText("除数不能为零");
clickable = false;
}
else
answerd /= Double.parseDouble(displayField.getText());
break;
default:
le(displayField.getText());
}
displayField.setText("");
prekey = key = 0;
}
//'-'操作
if (temp == button[11])
{
switch (prekey)
{
case 0:
answerd += Double.parseDouble(displayField.getText());
break;
case 1:
answerd -= Double.parseDouble(displayField.getText());
break;
case 2:
answerd *= Double.parseDouble(displayField.getText());
break;
case 3:
if (Double.parseDouble(displayField.getText()) == 0)
{
displayField.setText("除数不能为零");
clickable = false;
}
else
answerd /= Double.parseDouble(displayField.getText());
break;
default:
answerd = Double.parseDouble(displayField.getText());
}
displayField.setText("");
prekey = key = 1;
}
//'*'操作
if (temp == button[12])
{
switch (prekey)
{
case 0:
answerd += Double.parseDouble(displayField.getText());
break;
case 1:
answerd -= Double.parseDouble(displayField.getText());
break;
case 2:
answerd *= Double.parseDouble(displayField.getText());
break;
case 3:
if (Double.parseDouble(displayField.getText()) == 0)
{
displayField.setText("除数不能为零");
clickable = false;
}
else
answerd /= Double.parseDouble(displayField.getText());
break;
default:
answerd = Double.parseDouble(displayField.getText());
}
displayField.setText("");
prekey = key = 2;
}
//'/'操作
if (temp == button[13])
{
switch (prekey)
{
case 0:
answerd += Double.parseDouble(displayField.getText());
break;
case 1:
answerd -= Double.parseDouble(displayField.getText());
break;
case 2:
answerd *= Double.parseDouble(displayField.getText());
break;
case 3:
if (Double.parseDouble(displayField.getText()) == 0)
{
displayField.setText("除数不能为零");
clickable = false;
}
else
answerd /= Double.parseDouble(displayField.getText());
break;
default:
answerd = Double.parseDouble(displayField.getText());
}
displayField.setText("");
prekey = key = 3;
}
}
//'='操作
if (temp == EqButton && clickable == true)
{
//如果连续按'=',则进行连续运算
if (prekey == 5)
{
if (key == 0)
{
answerd += vard;
displayField.setText(df.format(answerd));
}
if (key == 1)
{
answerd -= vard;
displayField.setText(df.format(answerd));
}
if (key == 2)
{
answerd *= vard;
displayField.setText(df.format(answerd));
}
if (key == 3)
{
if (Double.parseDouble(displayField.getText()) == 0)
{
displayField.setText("除数不能为零");
clickable = false;
}
else
{
answerd /= vard;
displayField.setText(df.format(answerd));
}
}
}
else
{
vard = Double.parseDouble(displayField.getText());
if (key == 0)
{
prekey = -1;
answerd += Double.parseDouble(displayField.getText());
displayField.setText(df.format(answerd));
}
if (key == 1)
{
prekey = -1;
answerd -= Double.parseDouble(displayField.getText());
displayField.setText(df.format(answerd));
}
if (key == 2)
{
prekey = -1;
answerd *= Double.parseDouble(displayField.getText());
displayField.setText(df.format(answerd));
}
if (key == 3)
{
prekey = -1;
if (Double.parseDouble(displayField.getText()) == 0)
{
displayField.setText("除数不能为零");
clickable = false;
}
else
{
answerd /= Double.parseDouble(displayField.getText());
displayField.setText(df.format(answerd));
}
}
}
prekey = 5;
}
//按下'+/-'按钮时处理
if (temp == button[15] && clickable == true)
{
boolean isNumber = true;
String s = displayField.getText();
for (int i = 0; i < s.length(); i++)
if (! (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.' || s.charAt(i) == '-'))
{
isNumber = false;
break;
}
if (isNumber == true)
{
//如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉
if (s.charAt(0) == '-')
{
displayField.setText("");
for (int i = 1; i < s.length(); i++)
{
char a = s.charAt(i);
displayField.setText(displayField.getText() + a);
}
}
//如果当前字符串第一个字符不是符号,则添加一个符号在首字母处
else
displayField.setText('-' + s);
}
}
//按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除
if (temp == BkButton && clickable == true)
{
String s = displayField.getText();
displayField.setText("");
for (int i = 0; i < s.length() - 1; i++)
{
char a = s.charAt(i);
displayField.setText(displayField.getText() + a);
}
}
//按下'CE'按钮,将当前文本框内数据清除
if (temp == CeButton)
{
displayField.setText("");
clickable = true;
}
//按下'C'按钮,文本框内数据清除,同时var,answer清0
if (temp == CButton)
{
vard = answerd = 0;
displayField.setText("");
clickable = true;
}
}
//输入中如果有操作非法,比如按下两次'+',捕获异常
catch (Exception e)
{
displayField.setText("操作非法");
clickable = false;
}
}
public static void main(String args[])
{
Calculator calculator = new Calculator();
calculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
calculator.setSize(300,200);
calculator.setVisible(true);
}
}
四、测试分析
(1)程序运行情况
该程序正常的响应按钮事件,能进行简单的加、减、乘、除四则运算,在输入之前须先进行清零处理,然后再输入数值进行运算。但输入的数值不宜过大,否则不能正常显示。同时用df来设置数据的输出精度,精确到小数点后八位数字。如果输入中有非法操作时,比如两次按下“+”,就会出现异常情况,我在程序中使用了try—catch捕捉输入中抛出的异常对象,然后进行重置归零的处理。
(2)程序异常处理
当输入中有非法操作时,比如两次按下“+”运算,会出现异常情况,我在程序中使用了try—catch捕捉输入中抛出的异常对象,然后进行重置归零的处理。相应的程序代码如下:
try
{
……
}
//如果输入中有操作非法,比如两次按下“+”,捕获异常
catch(Exception e)
{
displayField.setText(“操作非法”);
clickable = false;
}
五、总结
18周的java课程设计结束了,虽然选的题目有点儿简单---“用java编程实现一个简单的计算器,能进行四则运算”,但感觉收获还是挺多的,通过学习自己扩充了很多的知识点。刚开始的时候不知道从何处下手,到图书馆借书、从网上查找相关的程序...渐渐的有了思路,虽然设计出来的程序有些是从别处转来的,不是自己写的,但是在转的过程中对出现的问题都能及时得到解决,感觉挺好的....通过这周的课程设计,我意识到好的学习方法的重要性,在学习中要学会主动,不要什么东西都指望别人,要靠自己去细心观察,多问自己一个为什么,多动手查查、看看,这样自己学到手的东西才会更多!
六、参考文献
1、《Java应用与开发案例教程》 徐谡 清华大学出版社
2、《零起点Java应用编程》 Philip Heller 电子工业出版社
3、《Java完美编程(第3版)》 Walter Savitch 清华大学出版社
4、《Java大学英语教程(第六版)》 H.M Deitel & P.J Deitel 电子工业出版社下载本文