设计任务与目标
参考Windows操作系统提供的计算器设计一个实用的计算器,要求除了具有普通的计算功能外,还具有保存计算过程的功能。
(1)单击计算器上的数字按钮(0、1、2、3、4、5、6、7、8、9)可以设置参与计算的运算数。
(2)单击计算器上的运算符按钮(+、一、*、可以选择运算符号。
(3)单击计算器上的函数按钮可以计算出相应的函数值。
(4)单击计算器上的等号(-)按钮显示计算结果。
(5)在一个文本框中显示当前的计算过程,在一个文本区中显示以往的计算过程。
(6)单击"保存"按钮可以将文本区中显示的全部计算过程保存到文件单击"复制。按钮可以将文本区中选中的文本复制到剪贴板单击。清除"按钮可以清除文本区中的全部内容。
方案设计与论证
数据模型:
根据系统设计要求在数据模型部分编写了以下类。
Computer类:封装计算器的计算模型。
PlayMusic类:调用javafx.scene.media包内AudioClip类实现音乐播放。
MathComputer接口:封装复杂的数学计算方法。
Sqrt类:实现MathComputer接口,其实例计算平方根。
Reciprocal类:实现MathComputer接口,其实例负责计算倒数。
poN类:实现MathComputer接口,其实例负责求负运算。
视图设计:
GUI程序为用户提供更好的用户界面,GUI部分设计的类如下。
CalculatorWindows类:其实例为Computer类的实力提供外观显示。
HandleEvent类:实现ActionListener接口的类,封装了需要处理ActionEvent事件的共用方法。
HandleDigt类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击数字按钮触发的ActionEvent事件。
HandleBack类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击退格按钮触发的ActionEvent事件。
HandleClear类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击清零按钮触发的ActionEvent事件。
HandleEquation类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击等号按钮触发的ActionEvent事件。
HandleFile类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击保存按钮触发的ActionEvent事件。
HandleOperator类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击运算符按钮触发的ActionEvent事件。
HandlePN类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击正负号按钮触发的ActionEvent事件。
HandleReciproal类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击求倒数按钮触发的ActionEvent事件。
HandleSqrt类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击求平方根按钮触发的ActionEvent事件。
HandleMusic类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击播放音乐按钮触发的ActionEvent事件。
HandleScale类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击切换精度按钮触发的ActionEvent事件。
//Computer.java
package com.calculator.data;
import java.math.BigDecimal;
import java.util.*;
public class Computer {
public double result;
public Stack<Character> dataItem;
public Stack<Double> tempResult;
public Stack<Character> operator;
public int SCALE=10;
public Computer() {
init();
}
public void init() {
dataItem = new Stack<Character>();
tempResult = new Stack<Double>();
dataItem.push('0');
operator = new Stack<Character>();
}
public void setDataItem(char c) {
if(c != '.')
dataItem.push(c);
else {
if(!dataItem.contains('.'))
dataItem.push(c);
}
}
public void setOperator(char p){
if(dataItem.empty()) {
operator.clear();
operator.push(p);
return;
}
if(operator.empty()) {
operator.push(p);
double m = computerDataItem();
dataItem.removeAllElements();
tempResult.push(m);
}else {
double mData = computerDataItem();
dataItem.removeAllElements();
char yuansuan = operator.pop();
double rTemp = tempResult.pop();
if(yuansuan == '+')
rTemp = rTemp + mData;
else if(yuansuan == '-')
rTemp = rTemp - mData;
else if(yuansuan == '/')
rTemp = rTemp / mData;
else if(yuansuan == '*')
rTemp = rTemp * mData;
tempResult.push(rTemp);
operator.push(p);
}
}
public char getOperator() {
if(operator.empty()) {
return '\0';
}
return operator.peek();
}
public void backspace() {
if(dataItem.size() >= 1) {
dataItem.pop();
}
}
public void initDataItemByMath(MathComputer computer) {
computer.handle(this);
}
public double getResult() {
double endItem = 0;
if(dataItem.empty()) {
if (!tempResult.empty()) {
endItem = tempResult.peek();
}
}else {
endItem = computerDataItem();
}
if(operator.empty()) {
result = endItem;
return result;
}
char yunsuan = operator.peek();
if((yunsuan == '+')