SimpleJavaCalculator.java
package simplejavacalculator;
public class SimpleJavaCalculator {
public static void main(String[] args) {
UI uiCal = new UI();
uiCal.init();
}
}
UI.java
package simplejavacalculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class UI implements ActionListener {
private final JFrame frame; //定义框
private final JPanel panel1,panel2; //定义板
private final JTextArea text;//定义文本
private final JButton but[], butAdd, butMinus, butMultiply, butDivide,
butEqual, butCancel, butSquareRoot, butSquare, butOneDevidedBy,
butCos, butSin, butTan, butxpowerofy, butlog, butrate;
private final Calculator calc;//定义计算对象
//定义字符串数组
private final String[] buttonValue = { "0", "1", "2", "3", "4", "5", "6",
"7", "8", "9" };
//UI类构造函数
public UI() {
frame = new JFrame("简易计算器"); //创建框
frame.setLayout(new BorderLayout());
frame.setResizable(false); //设置边框大小不可调
panel1=new JPanel();
panel2 = new JPanel(new GridLayout(5,5,2,2));//板设置成流式布局
text = new JTextArea(1,1); //文版框的height和width
// text.setAlignmentX(0);
text.setFont(new Font("楷体",Font.ITALIC,30));
text.setForeground(Color.blue);
but = new JButton[10]; //创建按钮数组
for (int i = 0; i < 10; i++) {
but[i] = new JButton(String.valueOf(i));//int转换成字符串
}
butAdd = new JButton("+");
butMinus = new JButton("-");
butMultiply = new JButton("*");
butDivide = new JButton("/");
butEqual = new JButton("=");
butSquareRoot = new JButton("√");
butSquare = new JButton("x*x");
butOneDevidedBy = new JButton("1/x");
butCos = new JButton("Cos");
butSin = new JButton("Sin");
butTan = new JButton("Tan");
butxpowerofy = new JButton("x^y");
butlog = new JButton("lg");
butrate = new JButton("x%");
butCancel = new JButton("C");
calc = new Calculator();//创建计算类对象calc,由他负责完成计算
}
public void init() {
frame.setVisible(true);//设置框可见
frame.setSize(330, 300);//设置框大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/设置默认关闭操作
frame.add(panel1,"North");//板1加到框的北边
frame.add(panel2,"South");
panel1.add(text);//添加文本框到板1
for (int i = 1; i < 10; i++) { //循环添加数字按钮
panel2.add(but[i]);
but[i].addActionListener(this);
}
panel2.add(but[0]);
but[0].addActionListener(this);
panel2.add(butAdd);
panel2.add(butMinus);
panel2.add(butMultiply);
panel2.add(butDivide);
panel2.add(butSquare);
panel2.add(butSquareRoot);
panel2.add(butOneDevidedBy);
panel2.add(butCos);
panel2.add(butSin);
panel2.add(butTan);
panel2.add(butxpowerofy);
panel2.add(butlog);
panel2.add(butrate);
panel2.add(butEqual);
panel2.add(butCancel);
//添加动作监听器
butAdd.addActionListener(this);
butMinus.addActionListener(this);
butMultiply.addActionListener(this);
butDivide.addActionListener(this);
butSquare.addActionListener(this);
butSquareRoot.addActionListener(this);
butOneDevidedBy.addActionListener(this);
butCos.addActionListener(this);
butSin.addActionListener(this);
butTan.addActionListener(this);
butxpowerofy.addActionListener(this);
butlog.addActionListener(this);
butrate.addActionListener(this);
butEqual.addActionListener(this);
butCancel.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
final Object source = e.getSource();
for (int i = 0; i < 10; i++) {
if (source == but[i]) {
text.replaceSelection(buttonValue[i]);//将文本内容置换
return;
}
}
//写相应运算符,读出结果
if (source == butAdd) {
writer(calc.calculateBi(Calculator.BiOperatorModes.add, reader()));
}
if (source == butMinus) {
writer(calc.calculateBi(Calculator.BiOperatorModes.minus, reader()));
}
if (source == butMultiply) {
writer(calc.calculateBi(Calculator.BiOperatorModes.multiply,
reader()));
}
if (source == butDivide) {
writer(calc
.calculateBi(Calculator.BiOperatorModes.divide, reader()));
}
if (source == butxpowerofy) {
writer(calc
.calculateBi(Calculator.BiOperatorModes.xpowerofy, reader()));
}
if (source == butSquare) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.square,
reader()));
}
if (source == butSquareRoot) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.squareRoot,
reader()));
}
if (source == butOneDevidedBy) {
writer(calc.calculateMono(
Calculator.MonoOperatorModes.oneDevidedBy, reader()));
}
if (source == butCos) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.cos,
reader()));
}
if (source == butSin) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.sin,
reader()));
}
if (source == butTan) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.tan,
reader()));
}
if (source == butlog) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.log,
reader()));
}
if (source == butrate) {
writer(calc.calculateMono(Calculator.MonoOperatorModes.rate,
reader()));
}
if (source == butEqual) {
writer(calc.calculateEqual(reader()));
}
if (source == butCancel) {
writer(calc.reset());
}
text.selectAll();
}
public Double reader() {
Double num;
String str;
str = text.getText();
num = Double.valueOf(str);
return num;
}
public void writer(final Double num) {
if (Double.isNaN(num)) {
text.setText("");
} else {
text.setText(Double.toString(num));
}
}
}
Calculator.java
package simplejavacalculator;
import static java.lang.Math.log;
import static java.lang.Math.log10;
import static java.lang.Math.pow;
public class Calculator {
public enum BiOperatorModes {
normal, add, minus, multiply, divide , xpowerofy
}
public enum MonoOperatorModes {
square, squareRoot, oneDevidedBy, cos, sin, tan ,log , rate
}
private Double num1, num2;
private BiOperatorModes mode = BiOperatorModes.normal;
private Double calculateBiImpl() {
if (mode == BiOperatorModes.normal) {
return num2;
}
if (mode == BiOperatorModes.add) {
return num1 + num2;
}
if (mode == BiOperatorModes.minus) {
return num1 - num2;
}
if (mode == BiOperatorModes.multiply) {
return num1 * num2;
}
if (mode == BiOperatorModes.divide) {
return num1 / num2;
}
if (mode == BiOperatorModes.xpowerofy) {
return pow(num1,num2);
}
// never reach
throw new Error();
}
public Double calculateBi(BiOperatorModes newMode, Double num) {
if (mode == BiOperatorModes.normal) {
num2 = 0.0;
num1 = num;
mode = newMode;
return Double.NaN;
} else {
num2 = num;
num1 = calculateBiImpl();
mode = newMode;
return num1;
}
}
public Double calculateEqual(Double num) {
return calculateBi(BiOperatorModes.normal, num);
}
public Double reset() {
num2 = 0.0;
num1 = 0.0;
mode = BiOperatorModes.normal;
return Double.NaN;
}
public Double calculateMono(MonoOperatorModes newMode, Double num) {
if (newMode == MonoOperatorModes.square) {
return num * num;
}
if (newMode == MonoOperatorModes.squareRoot) {
return Math.sqrt(num);
}
if (newMode == MonoOperatorModes.oneDevidedBy) {
return 1 / num;
}
if (newMode == MonoOperatorModes.cos) {
return Math.cos(num);
}
if (newMode == MonoOperatorModes.sin) {
return Math.sin(num);
}
if (newMode == MonoOperatorModes.tan) {
return Math.tan(num);
}
if (newMode == MonoOperatorModes.log) {
return log10(num);
}
if (newMode == MonoOperatorModes.rate) {
return num / 100;
}
// never reach
throw new Error();
}
}