[Java] java版计算器 →→→→→进入此内容的聊天室

来自 , 2019-12-25, 写在 Java, 查看 108 次.
URL http://www.code666.cn/view/389bc7bb
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.math.BigDecimal;
  6. import java.math.MathContext;
  7. import java.math.RoundingMode;
  8. import java.awt.Color;
  9.  
  10. /**
  11.  * java版计算器
  12.  */
  13. public class Calculator extends JFrame {
  14.         final int WIN_W = 250, WIN_H = 250;
  15.         JPanel myPanel, panelSuper;
  16.  
  17.         public Calculator() {
  18.  
  19.                 // 主面板
  20.                 panelSuper = new JPanel();
  21.                 panelSuper.setLayout(null);
  22.  
  23.                 // 设置窗口位置
  24.                 double width = Toolkit.getDefaultToolkit().getScreenSize().width;
  25.                 double height = Toolkit.getDefaultToolkit().getScreenSize().height;
  26.                 this.setBounds((int) (width - WIN_W) / 2, (int) (height - WIN_H) / 2,
  27.                                 WIN_W, WIN_H);
  28.  
  29.                 // 窗口配置
  30.                 this.setTitle("java版计算器");
  31.                 this.validate();
  32.                 this.setResizable(false);
  33.                 this.setVisible(true);
  34.                 this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  35.  
  36.                 // 添加计算器按钮面板
  37.                 myPanel = new MyPanel();
  38.                 this.add(myPanel, BorderLayout.CENTER);
  39.  
  40.         }
  41.  
  42.         public static void main(String[] args) {
  43.                 new Calculator();
  44.         }
  45.  
  46.         /**
  47.          * 计算器按钮面板类
  48.          */
  49.         class MyPanel extends JPanel implements ActionListener {
  50.                 JButton button1, button2, button3, button4, button5, button6, button7,
  51.                                 button8, button9, button0, buttonJia, buttonJian, buttonCheng,
  52.                                 buttonChu, buttonDeng, buttonDian, buttonC, buttonDel,
  53.                                 buttonZF, buttonGH;
  54.                 JTextField jTextField; // 计算器显示屏
  55.                 char oper; // 操作符
  56.                 String key, allKey = "1234567890.±del", jjccKey = "+-*/";
  57.                 BigDecimal d1, d2;
  58.                 boolean first;
  59.  
  60.                 public MyPanel() {
  61.  
  62.                         // 设置布局
  63.                         this.setLayout(new FlowLayout(FlowLayout.LEFT, 4, 5));
  64.  
  65.                         // 计算器显示屏
  66.                         jTextField = new JTextField(21);
  67.                         jTextField.setHorizontalAlignment(JTextField.RIGHT);
  68.                         jTextField.setEditable(false);
  69.                         jTextField.setBackground(new Color(255, 255, 255));
  70.                         jTextField.setText("0");
  71.                         this.add(jTextField);
  72.  
  73.                         // 计算器按钮
  74.                         button1 = new JButton("1");
  75.                         button2 = new JButton("2");
  76.                         button3 = new JButton("3");
  77.                         button4 = new JButton("4");
  78.                         button5 = new JButton("5");
  79.                         button6 = new JButton("6");
  80.                         button7 = new JButton("7");
  81.                         button8 = new JButton("8");
  82.                         button9 = new JButton("9");
  83.                         button0 = new JButton("0");
  84.                         buttonJia = new JButton("+");
  85.                         buttonJian = new JButton("-");
  86.                         buttonCheng = new JButton("*");
  87.                         buttonChu = new JButton("/");
  88.                         buttonDeng = new JButton("=");
  89.                         buttonDian = new JButton(".");
  90.                         buttonDel = new JButton("del");
  91.                         buttonC = new JButton("c");
  92.                         buttonZF = new JButton("±");
  93.                         buttonGH = new JButton("√");
  94.                         button1.setPreferredSize(new Dimension(55, 30));
  95.                         button2.setPreferredSize(new Dimension(55, 30));
  96.                         button3.setPreferredSize(new Dimension(55, 30));
  97.                         button4.setPreferredSize(new Dimension(55, 30));
  98.                         button5.setPreferredSize(new Dimension(55, 30));
  99.                         button6.setPreferredSize(new Dimension(55, 30));
  100.                         button7.setPreferredSize(new Dimension(55, 30));
  101.                         button8.setPreferredSize(new Dimension(55, 30));
  102.                         button9.setPreferredSize(new Dimension(55, 30));
  103.                         button0.setPreferredSize(new Dimension(55, 30));
  104.                         buttonJia.setPreferredSize(new Dimension(55, 30));
  105.                         buttonJian.setPreferredSize(new Dimension(55, 30));
  106.                         buttonCheng.setPreferredSize(new Dimension(55, 30));
  107.                         buttonChu.setPreferredSize(new Dimension(55, 30));
  108.                         buttonDeng.setPreferredSize(new Dimension(55, 30));
  109.                         buttonDian.setPreferredSize(new Dimension(55, 30));
  110.                         buttonDel.setPreferredSize(new Dimension(55, 30));
  111.                         buttonC.setPreferredSize(new Dimension(55, 30));
  112.                         buttonZF.setPreferredSize(new Dimension(55, 30));
  113.                         buttonGH.setPreferredSize(new Dimension(55, 30));
  114.                         this.add(buttonDel);
  115.                         this.add(buttonC);
  116.                         this.add(buttonZF);
  117.                         this.add(buttonGH);
  118.                         this.add(button1);
  119.                         this.add(button2);
  120.                         this.add(button3);
  121.                         this.add(buttonJia);
  122.                         this.add(button4);
  123.                         this.add(button5);
  124.                         this.add(button6);
  125.                         this.add(buttonJian);
  126.                         this.add(button7);
  127.                         this.add(button8);
  128.                         this.add(button9);
  129.                         this.add(buttonCheng);
  130.                         this.add(button0);
  131.                         this.add(buttonDian);
  132.                         this.add(buttonDeng);
  133.                         this.add(buttonChu);
  134.                         buttonDel.addActionListener(this);
  135.                         buttonC.addActionListener(this);
  136.                         buttonZF.addActionListener(this);
  137.                         buttonGH.addActionListener(this);
  138.                         button1.addActionListener(this);
  139.                         button2.addActionListener(this);
  140.                         button3.addActionListener(this);
  141.                         button4.addActionListener(this);
  142.                         button5.addActionListener(this);
  143.                         button6.addActionListener(this);
  144.                         button7.addActionListener(this);
  145.                         button8.addActionListener(this);
  146.                         button9.addActionListener(this);
  147.                         button0.addActionListener(this);
  148.                         buttonJia.addActionListener(this);
  149.                         buttonJian.addActionListener(this);
  150.                         buttonCheng.addActionListener(this);
  151.                         buttonChu.addActionListener(this);
  152.                         buttonDeng.addActionListener(this);
  153.                         buttonDian.addActionListener(this);
  154.  
  155.                         // 计算器初始化
  156.                         init();
  157.                 }
  158.  
  159.                 /**
  160.                  * 计算器初始化
  161.                  */
  162.                 public void init() {
  163.                         d1 = new BigDecimal("0");
  164.                         d1 = new BigDecimal("0");
  165.                         key = "=";
  166.                         oper = '=';
  167.                         jTextField.setText("0");
  168.                         first = true; // 用于标记是否进行连续操作(例如按键顺序为“9*9====”,第一次等于first由true变为false,如果!first,按等号相当于用上一次的结果与第二个操作数相乘)
  169.                 }
  170.  
  171.                 /**
  172.                  * 按钮监听
  173.                  */
  174.                 public void actionPerformed(ActionEvent e) {
  175.                         JButton b = (JButton) e.getSource();
  176.                         if (b == buttonDian) { // 按下.
  177.  
  178.                                 jTextField.setText(jTextField.getText() + ".");
  179.                                 if (first) {
  180.                                         d2 = d1 = getNum();
  181.                                 } else {
  182.                                         d2 = getNum();
  183.                                 }
  184.                         } else if (b == buttonZF) {// 按下±
  185.                                 BigDecimal d = getNum();
  186.                                 d = new BigDecimal("0").subtract(d);
  187.                                 setFormatNum(d);
  188.                                 if (first) {
  189.                                         d2 = d1 = getNum();
  190.                                 } else {
  191.                                         d2 = getNum();
  192.                                 }
  193.                         } else if (b == buttonDel) {// 按下del
  194.                                 if (jTextField.getText().length() == 1
  195.                                                 || jTextField.getText().length() == 2
  196.                                                 && jTextField.getText().startsWith("-")) {
  197.                                         jTextField.setText("0");
  198.  
  199.                                 } else {
  200.                                         String s = jTextField.getText();
  201.                                         s = s.substring(0, s.length() - 1);
  202.                                         if (s.endsWith("E+") || s.endsWith("E-"))
  203.                                                 s = s.substring(0, s.length() - 2);
  204.                                         jTextField.setText(s);
  205.                                         if (first) {
  206.                                                 d2 = d1 = getNum();
  207.                                         } else {
  208.                                                 d2 = getNum();
  209.                                         }
  210.                                 }
  211.                         } else if (b == buttonC) {// 按下c
  212.                                 init();
  213.                         } else if (b == buttonJia) {// 按下+
  214.                                 BigDecimal s;
  215.                                 if (!first && allKey.indexOf(key) >= 0) {
  216.                                         if (oper == '-' || oper == '/') {
  217.                                                 s = operate(d1, oper, d2);
  218.                                         } else {
  219.                                                 s = operate(d2, oper, d1);
  220.                                         }
  221.                                         setFormatNum(s);
  222.                                 }// 如果不是第一次,且上一次操作是对数字进行操作
  223.                                 else {
  224.  
  225.                                         first = false;
  226.                                 }
  227.                                 d2 = d1 = getNum();
  228.                                 // System.out.print("111我执行啦\n");
  229.                                 oper = '+';
  230.                         } else if (b == buttonJian) {// 按下-
  231.                                 BigDecimal s;
  232.                                 if (!first && allKey.indexOf(key) >= 0) {
  233.                                         s = operate(d1, oper, d2);
  234.                                         setFormatNum(s);
  235.                                 }// 如果不是第一次,且上一次操作是对数字进行操作
  236.                                 else {
  237.                                         first = false;
  238.                                 }
  239.                                 d2 = d1 = getNum();
  240.                                 oper = '-';
  241.                         } else if (b == buttonCheng) {// 按下*
  242.                                 BigDecimal s;
  243.                                 if (!first && allKey.indexOf(key) >= 0) {
  244.                                         if (oper == '-' || oper == '/') {
  245.                                                 s = operate(d1, oper, d2);
  246.                                         } else {
  247.                                                 s = operate(d2, oper, d1);
  248.                                         }
  249.                                         setFormatNum(s);
  250.                                 }// 如果不是第一次,且上一次操作是对数字进行操作
  251.                                 else {
  252.                                         first = false;
  253.                                 }
  254.                                 d2 = d1 = getNum();
  255.                                 oper = '*';
  256.                         } else if (b == buttonChu) {// 按下/
  257.                                 BigDecimal s;
  258.                                 if (!first && allKey.indexOf(key) >= 0) {
  259.                                         s = operate(d1, oper, d2);
  260.                                         setFormatNum(s);
  261.                                 }// 如果不是第一次,且上一次操作是对数字进行操作
  262.                                 else {
  263.                                         first = false;
  264.                                 }
  265.                                 d2 = d1 = getNum();
  266.                                 oper = '/';
  267.                         } else if (b == buttonGH) {// 按下平方根
  268.                                 if (jTextField.getText().startsWith("-")) {
  269.                                         init();
  270.                                         return;
  271.                                 }
  272.                                 BigDecimal d = getNum();
  273.                                 MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN);
  274.                                 d = new BigDecimal(Math.sqrt(d.doubleValue()), mc);
  275.                                 setFormatNum(d);
  276.                                 if (first) {
  277.                                         d2 = d1 = getNum();
  278.                                 } else {
  279.                                         d2 = getNum();
  280.                                 }
  281.                         } else if (b == buttonDeng) {// 按下=
  282.                                 BigDecimal s = null;
  283.                                 d2 = getNum();
  284.                                 if (!key.equals("=")) {
  285.                                         s = operate(d1, oper, d2);
  286.                                 } else {
  287.                                         s = operate(d2, oper, d1);
  288.                                 }
  289.                                 if (oper != '=' && !key.equals("=")) {// 上一次操作为 +-*/
  290.                                         d1 = getNum();
  291.  
  292.                                 }
  293.                                 setFormatNum(s);
  294.                                 first = true;
  295.                         } else { // 按下其他按钮
  296.                                 if (this.jTextField.getText().equals("0")
  297.                                                 || allKey.indexOf(key) == -1) {
  298.                                         this.jTextField.setText(b.getText());
  299.                                 } else {
  300.                                         this.jTextField.setText(jTextField.getText() + b.getText());
  301.                                 }
  302.                                 if (first) {
  303.                                         d2 = d1 = getNum();
  304.                                 } else {
  305.                                         d2 = getNum();
  306.                                 }// d2作被加数:d2+d1
  307.                         }
  308.                         key = b.getText();
  309.                 }
  310.  
  311.                 /**
  312.                  * 获取操作数
  313.                  *
  314.                  * @return 操作数
  315.                  */
  316.                 public BigDecimal getNum() {
  317.                         BigDecimal d = new BigDecimal(jTextField.getText());
  318.                         return d;
  319.                 }
  320.  
  321.                 public void setFormatNum(BigDecimal dd) {
  322.                         MathContext mc = new MathContext(18, RoundingMode.HALF_DOWN);
  323.  
  324.                         BigDecimal d = new BigDecimal(dd.toString(), mc);
  325.                         String num = d.toString();
  326.                         if (num.endsWith(".0"))
  327.                                 num = num.replaceAll("\\.0", "");
  328.                         this.jTextField.setText(num);
  329.                 }
  330.  
  331.                 /**
  332.                  * 计算
  333.                  *
  334.                  * @param a1
  335.                  *            操作数1
  336.                  * @param c
  337.                  *            操作符
  338.                  * @param a2
  339.                  *            操作数2
  340.                  * @return
  341.                  */
  342.                 public BigDecimal operate(BigDecimal a1, char c, BigDecimal a2) {
  343.                         MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN);
  344.                         switch (c) {
  345.                         case '+':
  346.                                 return a1.add(a2);
  347.                         case '-':
  348.                                 return a1.subtract(a2);
  349.                         case '*':
  350.                                 return a1.multiply(a2);
  351.                         case '/':
  352.                                 if (a2.compareTo(new BigDecimal("0")) == 0) {
  353.                                         init();
  354.                                         return new BigDecimal("0");
  355.                                 }
  356.                                 return a1.divide(a2, mc);
  357.                         default:
  358.                                 return a2;
  359.                         }
  360.                 }
  361.         }
  362.  
  363. }
  364.  

回复 "java版计算器"

这儿你可以回复上面这条便签

captcha