import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.awt.Color;
/**
* java版计算器
*/
public class Calculator extends JFrame {
final int WIN_W = 250, WIN_H = 250;
JPanel myPanel, panelSuper;
public Calculator() {
// 主面板
panelSuper = new JPanel();
panelSuper.setLayout(null);
// 设置窗口位置
double width = Toolkit.getDefaultToolkit().getScreenSize().width;
double height = Toolkit.getDefaultToolkit().getScreenSize().height;
this.setBounds((int) (width - WIN_W) / 2, (int) (height - WIN_H) / 2,
WIN_W, WIN_H);
// 窗口配置
this.setTitle("java版计算器");
this.validate();
this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// 添加计算器按钮面板
myPanel = new MyPanel();
this.add(myPanel, BorderLayout.CENTER);
}
public static void main(String[] args) {
new Calculator();
}
/**
* 计算器按钮面板类
*/
class MyPanel extends JPanel implements ActionListener {
JButton button1, button2, button3, button4, button5, button6, button7,
button8, button9, button0, buttonJia, buttonJian, buttonCheng,
buttonChu, buttonDeng, buttonDian, buttonC, buttonDel,
buttonZF, buttonGH;
JTextField jTextField; // 计算器显示屏
char oper; // 操作符
String key, allKey = "1234567890.±del", jjccKey = "+-*/";
BigDecimal d1, d2;
boolean first;
public MyPanel() {
// 设置布局
this.setLayout(new FlowLayout(FlowLayout.LEFT, 4, 5));
// 计算器显示屏
jTextField = new JTextField(21);
jTextField.setHorizontalAlignment(JTextField.RIGHT);
jTextField.setEditable(false);
jTextField.setBackground(new Color(255, 255, 255));
jTextField.setText("0");
this.add(jTextField);
// 计算器按钮
button1 = new JButton("1");
button2 = new JButton("2");
button3 = new JButton("3");
button4 = new JButton("4");
button5 = new JButton("5");
button6 = new JButton("6");
button7 = new JButton("7");
button8 = new JButton("8");
button9 = new JButton("9");
button0 = new JButton("0");
buttonJia = new JButton("+");
buttonJian = new JButton("-");
buttonCheng = new JButton("*");
buttonChu = new JButton("/");
buttonDeng = new JButton("=");
buttonDian = new JButton(".");
buttonDel = new JButton("del");
buttonC = new JButton("c");
buttonZF = new JButton("±");
buttonGH = new JButton("√");
button1.setPreferredSize(new Dimension(55, 30));
button2.setPreferredSize(new Dimension(55, 30));
button3.setPreferredSize(new Dimension(55, 30));
button4.setPreferredSize(new Dimension(55, 30));
button5.setPreferredSize(new Dimension(55, 30));
button6.setPreferredSize(new Dimension(55, 30));
button7.setPreferredSize(new Dimension(55, 30));
button8.setPreferredSize(new Dimension(55, 30));
button9.setPreferredSize(new Dimension(55, 30));
button0.setPreferredSize(new Dimension(55, 30));
buttonJia.setPreferredSize(new Dimension(55, 30));
buttonJian.setPreferredSize(new Dimension(55, 30));
buttonCheng.setPreferredSize(new Dimension(55, 30));
buttonChu.setPreferredSize(new Dimension(55, 30));
buttonDeng.setPreferredSize(new Dimension(55, 30));
buttonDian.setPreferredSize(new Dimension(55, 30));
buttonDel.setPreferredSize(new Dimension(55, 30));
buttonC.setPreferredSize(new Dimension(55, 30));
buttonZF.setPreferredSize(new Dimension(55, 30));
buttonGH.setPreferredSize(new Dimension(55, 30));
this.add(buttonDel);
this.add(buttonC);
this.add(buttonZF);
this.add(buttonGH);
this.add(button1);
this.add(button2);
this.add(button3);
this.add(buttonJia);
this.add(button4);
this.add(button5);
this.add(button6);
this.add(buttonJian);
this.add(button7);
this.add(button8);
this.add(button9);
this.add(buttonCheng);
this.add(button0);
this.add(buttonDian);
this.add(buttonDeng);
this.add(buttonChu);
buttonDel.addActionListener(this);
buttonC.addActionListener(this);
buttonZF.addActionListener(this);
buttonGH.addActionListener(this);
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
button6.addActionListener(this);
button7.addActionListener(this);
button8.addActionListener(this);
button9.addActionListener(this);
button0.addActionListener(this);
buttonJia.addActionListener(this);
buttonJian.addActionListener(this);
buttonCheng.addActionListener(this);
buttonChu.addActionListener(this);
buttonDeng.addActionListener(this);
buttonDian.addActionListener(this);
// 计算器初始化
init();
}
/**
* 计算器初始化
*/
public void init() {
d1 = new BigDecimal("0");
d1 = new BigDecimal("0");
key = "=";
oper = '=';
jTextField.setText("0");
first = true; // 用于标记是否进行连续操作(例如按键顺序为“9*9====”,第一次等于first由true变为false,如果!first,按等号相当于用上一次的结果与第二个操作数相乘)
}
/**
* 按钮监听
*/
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
if (b == buttonDian) { // 按下.
jTextField.setText(jTextField.getText() + ".");
if (first) {
d2 = d1 = getNum();
} else {
d2 = getNum();
}
} else if (b == buttonZF) {// 按下±
BigDecimal d = getNum();
d = new BigDecimal("0").subtract(d);
setFormatNum(d);
if (first) {
d2 = d1 = getNum();
} else {
d2 = getNum();
}
} else if (b == buttonDel) {// 按下del
if (jTextField.getText().length() == 1
|| jTextField.getText().length() == 2
&& jTextField.getText().startsWith("-")) {
jTextField.setText("0");
} else {
String s = jTextField.getText();
s = s.substring(0, s.length() - 1);
if (s.endsWith("E+") || s.endsWith("E-"))
s = s.substring(0, s.length() - 2);
jTextField.setText(s);
if (first) {
d2 = d1 = getNum();
} else {
d2 = getNum();
}
}
} else if (b == buttonC) {// 按下c
init();
} else if (b == buttonJia) {// 按下+
BigDecimal s;
if (!first && allKey.indexOf(key) >= 0) {
if (oper == '-' || oper == '/') {
s = operate(d1, oper, d2);
} else {
s = operate(d2, oper, d1);
}
setFormatNum(s);
}// 如果不是第一次,且上一次操作是对数字进行操作
else {
first = false;
}
d2 = d1 = getNum();
// System.out.print("111我执行啦\n");
oper = '+';
} else if (b == buttonJian) {// 按下-
BigDecimal s;
if (!first && allKey.indexOf(key) >= 0) {
s = operate(d1, oper, d2);
setFormatNum(s);
}// 如果不是第一次,且上一次操作是对数字进行操作
else {
first = false;
}
d2 = d1 = getNum();
oper = '-';
} else if (b == buttonCheng) {// 按下*
BigDecimal s;
if (!first && allKey.indexOf(key) >= 0) {
if (oper == '-' || oper == '/') {
s = operate(d1, oper, d2);
} else {
s = operate(d2, oper, d1);
}
setFormatNum(s);
}// 如果不是第一次,且上一次操作是对数字进行操作
else {
first = false;
}
d2 = d1 = getNum();
oper = '*';
} else if (b == buttonChu) {// 按下/
BigDecimal s;
if (!first && allKey.indexOf(key) >= 0) {
s = operate(d1, oper, d2);
setFormatNum(s);
}// 如果不是第一次,且上一次操作是对数字进行操作
else {
first = false;
}
d2 = d1 = getNum();
oper = '/';
} else if (b == buttonGH) {// 按下平方根
if (jTextField.getText().startsWith("-")) {
init();
return;
}
BigDecimal d = getNum();
MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN);
d = new BigDecimal(Math.sqrt(d.doubleValue()), mc);
setFormatNum(d);
if (first) {
d2 = d1 = getNum();
} else {
d2 = getNum();
}
} else if (b == buttonDeng) {// 按下=
BigDecimal s = null;
d2 = getNum();
if (!key.equals("=")) {
s = operate(d1, oper, d2);
} else {
s = operate(d2, oper, d1);
}
if (oper != '=' && !key.equals("=")) {// 上一次操作为 +-*/
d1 = getNum();
}
setFormatNum(s);
first = true;
} else { // 按下其他按钮
if (this.jTextField.getText().equals("0")
|| allKey.indexOf(key) == -1) {
this.jTextField.setText(b.getText());
} else {
this.jTextField.setText(jTextField.getText() + b.getText());
}
if (first) {
d2 = d1 = getNum();
} else {
d2 = getNum();
}// d2作被加数:d2+d1
}
key = b.getText();
}
/**
* 获取操作数
*
* @return 操作数
*/
public BigDecimal getNum() {
BigDecimal d = new BigDecimal(jTextField.getText());
return d;
}
public void setFormatNum(BigDecimal dd) {
MathContext mc = new MathContext(18, RoundingMode.HALF_DOWN);
BigDecimal d = new BigDecimal(dd.toString(), mc);
String num = d.toString();
if (num.endsWith(".0"))
num = num.replaceAll("\\.0", "");
this.jTextField.setText(num);
}
/**
* 计算
*
* @param a1
* 操作数1
* @param c
* 操作符
* @param a2
* 操作数2
* @return
*/
public BigDecimal operate(BigDecimal a1, char c, BigDecimal a2) {
MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN);
switch (c) {
case '+':
return a1.add(a2);
case '-':
return a1.subtract(a2);
case '*':
return a1.multiply(a2);
case '/':
if (a2.compareTo(new BigDecimal("0")) == 0) {
init();
return new BigDecimal("0");
}
return a1.divide(a2, mc);
default:
return a2;
}
}
}
} |
|