Java 课程设计论文 ----计算器
------------------
目录
1.课程设计目的 1
1.1 课程设计目标 1
1.2 课程设计知识 2
1.3 课程设计简洁 2
2.程序设计思路 3
3.计算器界面及功能说明 3
3.1 计算器的界面 3
3.2 计算器功能 5
4.课程设计总结 8
**1.课程设计目的**
**1.1 课程设计目标**
本次课程设计很好的帮助我们复习巩固 Java 语言的基础知识,进一步加深对 Java 语
言的理解和掌握,通过本次课程设计,能够较全面的掌握面向对象程序设计的有关概念和开
发方法,较全面地理解、掌握和综合运用所学的知识,以便提高自身的编程能力,锻炼我们
分析解决实际问题的能力。
**1.2 课程设计知识**
此 次 Java 课 程 设 计 是 关 于 图 形 用 户 界 面 的 , 图 形 用 户 界 面 (Graphical User
Interface,GUI)是使用图形方式借助菜单、编辑框、面板、按钮、标签等标准界面元素以
及键盘、鼠标的操作,提供应用程序与用户进行数据交流的界面,实现人机交互,应用程序
及能够显示数据,也能获得用户输入的数据和需要执行的命令。在 Java 中,图形用户界面
的组件和事件由 java.awt 和 java.swing 包共同提供。java.awt 称为抽象窗口工具集(Abstract
Window Tookit,AWT),主要包括组件、事件处理模型、图形和图像工具、布局管理器等,
其中的组件通常称为 AWT 组件,而 Swing 组件扩展了 AWT 组件的功能;这里事件处理还直
接用到了 java.awt.event 包。
**1.3 课程设计简洁**
此次的课程设计,我做的是一个简单计算器。拿到老师布置的作业时,最初的想法
是做一个不仅能实现加减乘除等基本的运算,还能够实现四种进制之间的转换的计算器,但
实际操作过程中,设计计算器界面时没能把进制的转换设计进去,又改变了策略,放弃了进
制转换的实现;在添加按钮时,给各个按钮定义了算法,当鼠标点击某个按钮时就开始执行
那个按钮所定义的算法,生成数据并显示在文本编辑框中。所以最终设计的计算器只实现了
加、减、乘、除。开平方等简单运算的功能,但是我的计算器与标准计算器相比较大大的降
低了数字计算的难度,并且提高了计算的准确度和精确度。
**2.程序设计思路**
数字及运算符按钮组添加
private final String[] KEY
计算器命令键按钮组
private final String[] COMMAND
计算结果显示文本区,并将初始值设为零
JTextField RT = new JTextField("0");
构造方法 public Calculator()
初始化计算器方法 private void init()
计算器菜单设计 private void Caidan()
处理事件方法 public void actionPerformed(ActionEvent e)
建立一个类,为菜单项“关于计算器(A)”添加说明
class Shuoming extends JFrame
**3.计算器界面及功能说明**
**3.1 计算器的界面**
计算器的界面用到了 BorderLayout 布局管理和 GridLayout 布局管理。计算机的总体
布局是 BorderLayout 布局管理,边布局的北边放置了一个单行文本编辑框,用于显示数字及
计算结果;边布局的中间放置了面板 1;边布局的西边放置了面板 2。程序代码如下:
getContentPane().setLayout(new BorderLayout(3, 5));
getContentPane().add("North", RT);
getContentPane().add("Center", jp1);
getContentPane().add("West", jp2);
其中,面板 1 使用了四行五列的 GridLayout 布局管理,用于放置计算器上数字及
运算符建的按钮组,即 keys[i],按钮组的背景颜色设置为蓝色,并且在此处的第 7 行代码是
为该按钮组添加动作事件监听器,程序代码如下:
JPanel jp1 = new JPanel();
jp1.setLayout(new GridLayout(4, 5, 3, 3));
for (int i = 0; i < KEY.length; i++) {
keys[i] = new JButton(KEY[i]);
jp1.add(keys[i]);
keys[i].setForeground(Color.blue);
keys[i].addActionListener(this);
}
面板 2 使用了五行一列的 GridLayout 布局管理,用于放置计算器上命令建的按钮组,
即 comands[i],按钮组的背景颜色设置为绿色,并且在此处的第 7 行代码是为该按钮组添加
动作事件监听器,程序代码如下:
JPanel jp2 = new JPanel();
jp2.setLayout(new GridLayout(5, 1, 3, 3));
for (int i = 0; i < COMMAND.length; i++) {
commands[i] = new JButton(COMMAND[i]);
jp2.add(commands[i]);
commands[i].setForeground(Color.green);
commands[i].addActionListener(this);
}
计算器还添加了菜单,有 MenuBar 菜单栏、Menu 菜单和 MenuItem 菜单项,主要
是 m1 编辑和 m2 帮助菜单,编辑菜单中添加了"复制(C) Ctrl+C "和"粘贴(V) Ctrl+V "菜单项,
帮助菜单中添加了“帮助主题(H)”和“关于计算器(A)”菜单项,用 Caidan 类实现添加
菜单,其中 mb 是指 MenuBar 菜单栏对象,此处代码第 8 行是为 mi4“帮助主题(H)”菜单
项添加动作事件监听器,程序代码如下:
private void Caidan() {
Menu m1 = new Menu("编辑(E)");
Menu m2 = new Menu("帮助(H)");
MenuItem mi1 = new MenuItem("复制(C) Ctrl+C ");
MenuItem mi2 = new MenuItem("粘贴(V) Ctrl+v ");
MenuItem mi3 = new MenuItem("帮助主题(H)
");
MenuItem mi4 = new MenuItem("关于计算器(A)
mi4.addActionListener(this);
mb.add(m1);
mb.add(m2);
m1.add(mi1);
m1.add(mi2);
m2.add(mi3);
m2.add(mi4);
");
}
计
计算器运行界面如下图:

**3.2 计算器功能**
运
算
器
该计算器的功能是进行简单的加减乘除、求平方根、百分比、求倒数及正负数转
换等运算。除数字的输入为直接输入外,运算符如:+、-、*、/、开平方等要求计算时通过
内部较为复杂的运算将结果显示在文本编辑框上。
(1)对按钮组数字及运算符建的按钮组,即 keys[i]的事件处理:
private void handleNumber(String key) {
if (firstDigit) {
RT.setText(key);
}
else if((key.equals("."))&&(RT.getText().indexOf(".")< 0)) {
RT.setText(RT.getText() + ".");
} else if (!key.equals(".")) {
RT.setText(RT.getText() + key);
}
}
firstDigit = false;
RT.setText(key)指文本获取第一个数;输入小数点时,判断之前没有小数点,才能将小数点附
在结果文本框的后面,且后面不能再出现小数点如果输入的不是小数点,则将数字附在结果
文本框的后面。
(2)除法运算的实现:
if (operator.equals("/")) {
if (getNumberFromText() == 0.0)
{
operateValidFlag = false;
RT.setText("除数不能为零");
} else {
z /= getNumberFromText();
}
}
如果按了操作符“/”按钮,再一次进行判断,如果除数为零,则判断操作不合法(false),
此时文本框中显示“除数不能为零”;否则除数不为零,则进行除法运算;要进行连除运算
且除数不为零时,这个算法是先保存计算结果,然后再与下一个数进行除法运算,z 中保存
最终计算结果,在文本框中显示出来。
(3)倒数运算的实现与处罚运算类同。
(4)加法运算的实现:
else if (operator.equals("+")) {
z += getNumberFromText();
}
如果按了操作符“+”按钮,文本框中获取到的数字就做加法运算,并将计算结果保存到 z
中,这里的 z 表示中间计算结果;要进行连加运算时,这个算法是先保存计算结果,然后再
与下一个数相加,z 中保存最终计算结果,在文本框中显示出来。
(5)减法和乘法运算的原理与加法运算类同。
(6)其他运算符,sqrt、%、+/-运算的实现:按了对应操作符按钮时,文本框中获取
到的数字直接进行相关运算,并将结果保存到 z 中,在文本框中显示出来。
(7)计算器 Backspace 键的功能:
private void handleBackspace()
{
String text = RT.getText();
int i = text.length();
if (i > 0) {
text = text.substring(0, i - 1);
if (text.length() == 0) {
RT.setText("0");
firstDigit = true;
operator = "=";
}
else {
RT.setText(text);
}
}
}
实现退格,即文本框中输入的字符总长度大于零时,按一次 Backspace 按钮,就将文本中最
后一个字符去掉,如果字符总长度为零时,即 RT.setText("0"); 文本中没有了内容,则初始化
计算器的各种值,即文本框中显示数字“0”;否则 RT.setText(text);显示新的文本,即开始输
入的字符(未清除完的)。
(8)计算器 C 键的功能:
private void handleC() {
RT.setText("0");
firstDigit = true;
operator = "=";
}
实现清除,即文本框中的字符不为零时,按一次 C 按钮,就将文本中的字符全部清零,当前
文本显示结果为数字“0”。
(9)对菜单项“关于计算器(A)”添加事件监听,添加了一个说明小窗口,整体
布局用了 BorderLayout 布局管理,其中间放置了一个面板,该面板采用四行一列的 GridLayout
布局管理,上面放置了两个标签,两个文本区;标签分别是“版本号”和“时间”的标签,
两个文本区用来显示版本号和时间,这里的时间是指本次课程设计计算器的真正完成时间。
附加的小窗口运行界面如下:
窗
口
行

**4.课程设计总结**
运
通过本次课程设计,对所学的 java 知识得到了巩固与应用,对 java 有了更进一步的
认识与了解,不过设计过程中也遇到了很多问题。
首先,一开始写计算器界面时,各种组件是怎么加也加不上去,看似程序没啥问题,就是加
不上面板、按钮等等,后来在同学的帮助下,我们的一起努力下,发现整体布局添加不正确,
才导致加不上组件。
其次,计算器的功能实现时,对各组件添加完动作事件监听之后,对于计算器的各种运算如
何正确实现,怎么写也实现不了,只好上百度查阅、借鉴,与同学相互交流,才得以实现计
算器的各种运算功能。还有一个缺陷,菜单栏中虽然设计了“编辑—复制(C) Ctrl+C 、粘贴(V)
Ctrl+V ”以及“帮助—帮助主题(H)、关于计算器(A)”,但是功能只实现了“关于计算器
(A)”,其他的没有实现功能。还有存在的问题是,在关闭菜单项上附加的窗口时,计算器
窗口同时被关闭,我没有想到问题的根源,问了老师后发现是源于下面这行代码
sm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
也就是关闭当前窗口时,整个系统都关闭。
最后,通过老师的检查,班里大部分同学都写了简单计算器,只有极个别同学写了
其他,如计算房贷、画图板等。虽然我的也是计算器,但相比之下,很多同学的计算器没有
菜单,据我发现只有丁玉宝同学和我给计算器添加了菜单;对于计算器的界面,有同学用到
了流布局管理、卡片布局管理,而我用了边布局管理和网格布局管理;对于计算器功能的实
现,有同学写的计算器可以实现连加或连乘,中间不显示结果,最终才显示结果,而我的就
有点缺陷,只能是先显示中间结果,再继续加或乘。
总之,通过本次课程设计,进一步掌握了 java 程序编辑器、图形界面以及文件操作的实现;
和同学之间的相互讨论也使我受益匪浅,深受启发;同时也深刻体会到学习 Java 更是要拓
展知识面、拓展思维。但仍有不足之处,在解决实际问题上,还是缺乏思考。
```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener {
private final String[] KEY = { "7", "8", "9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-",
"1/x", "0",
"+/-", ".", "+", "=" };
private final String[] COMMAND = { "Backspace", "CE", "C", "(", ")" };
JButton keys[] = new JButton[KEY.length];
JButton commands[] = new JButton[COMMAND.length];
MenuBar mb;
JTextField RT = new JTextField("0");
private boolean firstDigit = true;// 标志用户按的是否是整个表达式的第一个数字,或者是
运算符后的第一个数字
private double z = 0.0; // 计算的中间结果。
private String operator = "="; // 当前运算的运算符
private boolean operateValidFlag = true; // 操作是否合法
public Calculator() {
init();
this.setBackground(Color.LIGHT_GRAY);
this.setTitle("计算器");
this.setLocation(400, 300);
mb = new MenuBar();
setMenuBar(mb);
this.setResizable(true);
Caidan();
this.pack(); // 计算器中各组件大小
}
private void init() {
RT.setHorizontalAlignment(JTextField.CENTER);
RT.setEditable(false);
RT.setBackground(Color.WHITE);
JPanel jp1 = new JPanel();
jp1.setLayout(new GridLayout(4, 5, 3, 3));
for (int i = 0; i < KEY.length; i++) {
keys[i] = new JButton(KEY[i]);
jp1.add(keys[i]);
keys[i].setForeground(Color.blue);
keys[i].addActionListener(this);
}
JPanel jp2 = new JPanel();
jp2.setLayout(new GridLayout(5, 1, 3, 3));
for (int i = 0; i < COMMAND.length; i++) {
commands[i] = new JButton(COMMAND[i]);
jp2.add(commands[i]);
commands[i].setForeground(Color.green);
commands[i].addActionListener(this);
}
getContentPane().setLayout(new BorderLayout(3, 5));
getContentPane().add("North", RT);
getContentPane().add("Center", jp1);
getContentPane().add("West", jp2);
}
private void Caidan() {
// TODO 自动生成的方法存根
Menu m1 = new Menu("编辑(E)");
Menu m2 = new Menu("帮助(H)");
MenuItem mi1 = new MenuItem("复制(C) Ctrl+C ");
MenuItem mi2 = new MenuItem("粘贴(V) Ctrl+v ");
MenuItem mi3 = new MenuItem("帮助主题(H)
");
MenuItem mi4 = new MenuItem("关于计算器(A)
mi4.addActionListener(this);
mb.add(m1);
mb.add(m2);
m1.add(mi1);
m1.add(mi2);
m2.add(mi3);
m2.add(mi4);
");
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String label = e.getActionCommand();
if (label.equals(COMMAND[0])) {
handleBackspace(); // 按"Backspace"键
}
else if (label.equals(COMMAND[1])) {
RT.setText("0"); // 按"CE"键
}
else if (label.equals(COMMAND[2])) {
handleC(); // 按"C"键
}
else if ("0123456789.".indexOf(label) >= 0) {
handleNumber(label); // 按数字键或者小数点键
}
else if(label.equals("关于计算器(A)
Shuoming sm=new Shuoming();
sm.setVisible(true);
//sm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
")){
}
else {
handleOperator(label); // 按运算符键
}
}
private void handleBackspace() // 退格
{
String text = RT.getText();
int i = text.length();
if (i > 0) {
text = text.substring(0, i - 1); // 将文本最后一个字符去掉
if (text.length() == 0) {
RT.setText("0"); // 如果文本没有了内容,则初始化计算器的各种值
firstDigit = true;
operator = "=";
}
else {
RT.setText(text); // 显示新的文本
}
}
}
private void handleC() {
RT.setText("0"); // 初始化计算器的各种值
firstDigit = true;
operator = "=";
}
private void handleNumber(String key) {