java版计算器详解编程语言

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; 
} 
} 
} 
} 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10320.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论