中文摘要
该程序是一个图形界面的简单Java计算器,具有良好的界面,使用人员能快捷简单的进行操作。即时准确地获得需要的计算结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。可以进行简单的四则运算(加、减、乘、除,等)。其中C表示清零,界面简洁使用方便。
目 录
一、课程设计任务及要求... 1
二、需求分析... 2
三、设计思路... 3
四、详细设计... 5
五、运行调试与分析讨论... 11
六、设计体会与小结... 14
七、参考文献... 15
一、课程设计任务及要求
设计一个图形界面(GUI)的计算器应用程序,完成简单的算术运算、设计的计算器应用程序可以完成家法、减法、乘法、除法和取余运算。且有小数点、正负号、求倒数、退格和清零功能。
二、需求分析
在日常生活中经常要用到计算器,比如科学计算器、数值计算、会计业务等,在Applet中实现一个精巧实用的计算器,可以让用户在使用网站服务的同时,可以很方便地进行数据运算,可增加页面的实用性,同时让用户的操作也更方便与快捷。本次实验要求实现一个具有四则运算的计算器,拥有加、减、乘、除功能,并且还要求具备清零等功能。
三、设计思路
本应用程序继承自框架类(Frame),此程序使用Frame布局管理器BorderLayout,将单行文本框加入到“North”区域,包含各种按钮的面板Panel p加入到”Center”区域。 包含各种按钮的面板Panel p 采用4行5列的网格布局,然后将数字按钮和运算符按钮以及控制按钮添加到面板中。同时注册按钮事件监听器。如:
Button b=new Button();
b.addActionListener(事件监听器);
事件监听器中的事件处理方法void actionPerformed(ActionEvent evt)完成主要的按钮事件的处理。事件处理分以下几种情况:数字按钮事件(”0”,”1”,”2”…”8”,”9”)、运算符按钮事件(”+”,”-“,”*”,”/”,”%”)、正负号按钮事件(”+/-“)、小数点按钮事件(”.”)、等号按钮事件(”=”)、求倒按钮事件(”1/x”)、退格按钮事件(”退格”)、清楚按钮事件(“C”)。
在事件处理。
触发按钮事件时,要进一步分析,是重新开始计算时触发的按钮事件还是计算中间触发的按钮事件。
计算器完成的是一个数学表达式,如:3+2,所以可以采用一个链表(LinkedList类)来存储数字或字符,如3,+,2分别存储在链表中,最后运算时,可以一一取出来进行运算。
本应用程序中的数字按钮和运算符按钮可以分别定义以下两个类的对象组件
数字按钮NumberButton类如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class NumberButton extends Button
{
int number;
public NumberButton(int number)
{
super(""+number);
this.number=number;
setForeground(Color.blue);
}
public int getNumber()
{
return number;
}
}
运算符按钮OperationButton类如下
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class OperationButton extends Button
{
String 运算符号;
public OperationButton(String s)
{
super(s);
运算符号=s;
setForeground(Color.red);
}
public String get运算符号()
{
return 运算符号;
}
}
四、详细设计
本程序主要包含两部分分别为主类和附类,程序详细设计如下:
1. 数据分析
计算器的程序设计,必然有数据的输入,当中就包含运算符和数字,都要通过计算器上的button按钮选项按键输入进去,里面录入的为字符型的数据,若要进行运算,要将输入的字符转换成double型,以防运算出错。
2. 类的设计
class Calculator extends JFrame implements ActionListener
{
}//Calculator 是初始化界面,以及响应用户的操作。
Calculate是个内部类,功能是进行进制的转换。
3. 功能设计
1数字键按钮,输入所需计算的数字。
2算数符按钮,输入所需的算数符号。
3等号按钮,输出运算的结果。
4C按钮,执行清零。
4. 程序代码
主类:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class SwingCalculator {
public static void main(String[] args) {
JFrame frame = new Calculator();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
附类:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class Calculator extends JFrame {
private final Font BIGGER_FONT = new Font("monspaced", Font.PLAIN, 20);
private JTextField textfield;
private boolean number = true;
private String equalOp = "=";
private CalculatorOp op = new CalculatorOp();
public Calculator() {
textfield = new JTextField("0", 12);
textfield.setHorizontalAlignment(JTextField.RIGHT);
textfield.setFont(BIGGER_FONT);
ActionListener numberListener = new NumberListener();
String buttonOrder = "1234567890 ";
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(4, 4, 4, 4));
for (int i = 0; i < buttonOrder.length(); i++) {
String key = buttonOrder.substring(i, i+1);
if (key.equals(" ")) {
buttonPanel.add(new JLabel(""));
} else {
JButton button = new JButton(key);
button.addActionListener(numberListener);
button.setFont(BIGGER_FONT);
buttonPanel.add(button);
}
}
ActionListener operatorListener = new OperatorListener();
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 4, 4, 4));
String[] opOrder = {"+", "-", "*", "/","=","C"};
for (int i = 0; i < opOrder.length; i++) {
JButton button = new JButton(opOrder[i]);
button.addActionListener(operatorListener);
button.setFont(BIGGER_FONT);
panel.add(button);
}
JPanel pan = new JPanel();
pan.setLayout(new BorderLayout(4, 4));
pan.add(textfield, BorderLayout.NORTH );
pan.add(buttonPanel , BorderLayout.CENTER);
pan.add(panel , BorderLayout.EAST );
this.setContentPane(pan);
this.pack();
this.setTitle("Calculator");
this.setResizable(false);
}
private void action() {
number = true;
textfield.setText("0");
equalOp = "=";
op.setTotal("0");
}
class OperatorListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (number) {
action();
textfield.setText("0");
} else {
number = true;
String displayText = textfield.getText();
if (equalOp.equals("=")) {
op.setTotal(displayText);
} else if (equalOp.equals("+")) {
op.add(displayText);
} else if (equalOp.equals("-")) {
op.subtract(displayText);
} else if (equalOp.equals("*")) {
op.multiply(displayText);
} else if (equalOp.equals("/")) {
op.divide(displayText);
}
textfield.setText("" + op.getTotalString());
equalOp = e.getActionCommand();
}
}
}
class NumberListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
String digit = event.getActionCommand();
if (number) {
textfield.setText(digit);
number = false;
} else {
textfield.setText(textfield.getText() + digit);
}
}
}
public class CalculatorOp {
private int total;
public CalculatorOp() {
total = 0;
}
public String getTotalString() {
return ""+total;
}
public void setTotal(String n) {
total = convertToNumber(n);
}
public void add(String n) {
total += convertToNumber(n);
}
public void subtract(String n) {
total -= convertToNumber(n);
}
public void multiply(String n) {
total *= convertToNumber(n);
}
public void divide(String n) {
total /= convertToNumber(n);
}
private int convertToNumber(String n) {
return Integer.parseInt(n);
}
}
}
五、运行调试与分析讨论
程序运行中所遇到的错误:
例如:
程序在运行中遇到很多的困难和错误,上述为列举错误中的两个,实际上程序在刚开始编译完成时遇到很多的错误,在通过自身努力和同学们的帮助下错误得以一一解决。以下就不一一举例所遇到的错误了。
程序运行如下:
运行状况如下:
例如 运行3×9
先输入3,在按*,在输入9
然后按=号,输出结果:
六、设计体会与小结
本次的Java课程设计使我对Java的知识有了更深一步的了解,同时在编译程序的时候对知识系统进行了更加全面的梳理,并通复习,和同学的帮助,终于熟练的掌握了基本理论知识,从而完成程序的编译。
本次课程设计还使我收获很大,使我对Java的设计过程有了更深的了解,和对知识的笑话和吸收,同时也巩固了Java课程的知识。当然在设计编译程序是遇到了不少的麻烦和错误,在通过老师和同学的共同帮助下一一得到了解决。
总之这次程序的设计让我发现了更多学习中没有遇到的问题,从而提高了综合能力。同时本次设计,使我明白了许多。
七、参考文献
[1]丁振凡主编.《Java语言实用教程》.北京:北京邮电大学出版社.2007
[2]李刚主编.《疯狂Java讲义》.北京:电子工业出版社.2008
[3]埃史尔主编.《Java编程思想》.北京:机械工业出版社.2007