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; // 用于標記是否進行連續操作(例如按鍵順序為“99====”,第一次等于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 '+':
case '-':return a1.add(a2);
case '*':return a1.subtract(a2);
case '/':return a1.multiply(a2);
default:if (a2.compareTo(new BigDecimal("0")) == 0) { init(); return new BigDecimal("0"); } return a1.divide(a2, mc);
} } }return a2;
}
</pre>