Kuangcp/JavaBase

View on GitHub
gui/src/main/java/com/github/kuangcp/caculator/Calculator.java

Summary

Maintainability
C
7 hrs
Test Coverage
package com.github.kuangcp.caculator;


import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.util.Objects;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import lombok.extern.slf4j.Slf4j;

/**
 * 搜到的一个计算器实现代码 TODO 思考如何重构
 */
@Slf4j
public class Calculator extends JFrame {

  private static final short width = 47;
  private static final short height = 38;
  private static final Font dialogFont = new Font("Dialog", Font.PLAIN, 16);

  private String front = "";
  private String behind = ""; //分别用于记录加减乘除运算符之前,之后输入的内容
  private String operator; //用于记录运算符
  private String result;//用于存储运算结果的字符串格式
  private boolean flag = false; //用于记录是否按下了运算符
  private boolean dotFlag = false;//用于判断是否输入了点运算符
  private boolean numFlag = false;//用于判断是否输入了数字
  private boolean calculateFlag = false;//用于判断是否按下了等号运算符

  private final JTextField txtResult = new JTextField("0");
  private final JTextField inputCache = new JTextField("");
  private final JButton btnNull = new JButton("  ");

  private final JButton btnDecrease = new JButton("-");
  private final JButton btnBegin = new JButton("C");

  private final JButton btnMultiply = new JButton("*");
  private final JButton btnCancel = new JButton("←");

  private final JButton btnMinus = new JButton("+/-");
  private final JButton btnPoint = new JButton(".");
  private final JButton btnDivide = new JButton("/");
  private final JButton btnEqual = new JButton("=");
  private final JButton btnIncrease = new JButton("+");

  private Calculator() {
    try {
      rootPane.setLayout(null);
      this.setResizable(false);
      setSize(new Dimension(400, 300));
      setTitle("计算器");

      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      initLogicButton();
      initNumberButton();
    } catch (Exception e) {
      log.error(e.getMessage(), e);
    }
  }

  /**
   * 初始化数字按钮
   */
  private void initNumberButton() {
    int startX = 30;
    int startY = 170;
    int deltaW = 70;
    int deltaH = 50;
    JButton[] numberButtons = new JButton[10];
    for (int i = 1; i < 10; i++) {
      JButton button = new JButton(String.valueOf(i));
      int x = startX + ((i - 1) % 3) * deltaW;
      int y = startY - ((i - 1) / 3) * deltaH;
      button.setBounds(new Rectangle(x, y, width, height));
      numberButtons[i] = button;
    }

    JButton btnZero = new JButton("0");
    btnZero.setBounds(new Rectangle(startX, startY + deltaH, width, height));
    numberButtons[0] = btnZero;

    //加载数字0-9的监听事件
    bindListener(numberButtons);
    configFont(numberButtons);
    showButton(numberButtons);
  }

  private void initLogicButton() {
    txtResult.setEnabled(false);
    txtResult.setEditable(false);
    txtResult.setHorizontalAlignment(SwingConstants.RIGHT);
    txtResult.setBounds(new Rectangle(33, 19, 310, 34));

    inputCache.setEnabled(false);
    inputCache.setEditable(false);
    inputCache.setHorizontalAlignment(SwingConstants.RIGHT);
    inputCache.setBounds(new Rectangle(27, 19, 310, 8));

    btnNull.setBounds(new Rectangle(298, 70, width, height));
    btnNull.setFont(new Font("Dialog", Font.PLAIN, 12));

    btnDecrease.setBounds(new Rectangle(234, 120, width, height));

    btnBegin.setBounds(new Rectangle(298, 121, width, height));

    btnBegin.addActionListener(new CalculateBtnBeginActionAdapter(this));

    btnMultiply.setBounds(new Rectangle(234, 172, width, height));

    btnCancel.setBounds(new Rectangle(298, 172, width, height));
    btnCancel.setFont(new Font("Dialog", Font.PLAIN, 12));

    btnCancel.addActionListener(new CalculateBtnCancelActionAdapter(this));

    configFont(txtResult, btnDecrease, btnBegin, btnMultiply, btnDivide, btnIncrease, btnEqual);

    btnMinus.setBounds(new Rectangle(101, 222, width, height));
    btnMinus.setFont(new Font("Dialog", Font.PLAIN, 10));

    btnMinus.addActionListener(new CalculateBtnMinusActionAdapter(this));
    btnPoint.setBounds(new Rectangle(167, 222, width, height));
    btnPoint.setFont(new Font("Dialog", Font.PLAIN, 30));
    btnPoint.setHorizontalTextPosition(SwingConstants.CENTER);

    btnPoint.addActionListener(new CalculateBtnPointActionAdapter(this));
    btnDivide.setBounds(new Rectangle(234, 222, width, height));

    btnEqual.setBounds(new Rectangle(298, 222, width, height));

    btnEqual.addActionListener(new CalculateBtnEqualActionAdapter(this));
    btnIncrease.setBounds(new Rectangle(234, 70, width, height));

    //加载加减乘除运算符的监听事件
    btnIncrease.addActionListener(new CalculateBtnIncreaseActionAdapter(this));
    btnDecrease.addActionListener(new CalculateBtnIncreaseActionAdapter(this));
    btnMultiply.addActionListener(new CalculateBtnIncreaseActionAdapter(this));
    btnDivide.addActionListener(new CalculateBtnIncreaseActionAdapter(this));

    showButton(btnDecrease, btnBegin, btnMultiply, btnCancel,
        btnMinus, btnPoint, btnDivide, btnEqual, btnIncrease, btnNull);

    rootPane.add(txtResult);
  }

  private void configFont(JComponent... components) {
    if (Objects.isNull(components)) {
      return;
    }
    for (JComponent component : components) {
      component.setFont(dialogFont);
    }
  }

  private void bindListener(JButton... buttons) {
    if (Objects.isNull(buttons)) {
      return;
    }
    for (JButton button : buttons) {
      if (Objects.isNull(button)) {
        continue;
      }
      button.addActionListener(new CalculateBtnZeroActionAdapter(this));
    }
  }

  private void showButton(JButton... buttons) {
    if (Objects.isNull(buttons)) {
      return;
    }
    if (Objects.isNull(rootPane)) {
      return;
    }
    for (JButton button : buttons) {
      if (Objects.isNull(button)) {
        continue;
      }

      rootPane.add(button);
    }
  }

  void btnZeroActionPerformed(ActionEvent e) {
    if (flag) { //如果刚刚按下了运算符
      txtResult.setText("");
      if (dotFlag) {//判断之前是否输入了点运算符
        txtResult.setText("0." + e.getActionCommand());
        dotFlag = false;
      } else {
        txtResult.setText(e.getActionCommand());
      }
      numFlag = true;
    } else {
      int num = txtResult.getText().indexOf(".");
      if (num < 0 && !txtResult.getText().equals("0")) {
        txtResult.setText(txtResult.getText() + e.getActionCommand());
      } else if (num < 0 && txtResult.getText().equals("0")) {
        txtResult.setText(e.getActionCommand());
      } else if (num >= 0 && txtResult.getText().equals("0")) {
        txtResult.setText("0." + e.getActionCommand());
      } else if (num >= 0 && !txtResult.getText().equals("0")) {
        txtResult.setText(txtResult.getText() + e.getActionCommand());
      }
    }
    flag = false;
    calculateFlag = false;
  }

  void btnIncreaseActionPerformed(ActionEvent e) {
    if (calculateFlag) {
      txtResult.setText(txtResult.getText());
      operator = e.getActionCommand(); //得到刚刚按下的运算符
      front = txtResult.getText(); //记录加减乘除运算符之前输入的内容
    } else if (numFlag) {
//            ActionEvent ee = new ActionEvent("qq", 1, "pp");
      btnEqualActionPerformed();
      operator = e.getActionCommand(); //得到刚刚按下的运算符
      front = result;
      numFlag = false;
    } else {
      front = txtResult.getText(); //记录加减乘除运算符之前输入的内容
      operator = e.getActionCommand(); //得到刚刚按下的运算符
    }
    calculateFlag = false;
    flag = true; //记录已经按下了加减乘除运算符的其中一个
  }

  void btnEqualActionPerformed() {
    if (!calculateFlag) { //未曾按下等于运算符
      behind = txtResult.getText();
    } else {
      front = result;
    }
    try {
      if (Objects.isNull(front) || front.isEmpty() || Objects.isNull(behind) || behind.isEmpty()) {
        return;
      }
      double a1 = Double.parseDouble(front);
      double b1 = Double.parseDouble(behind);
      double result;
      if (Objects.equals(operator, "+")) {
        result = a1 + b1;
      } else if (Objects.equals(operator, "-")) {
        result = a1 - b1;
      } else if (Objects.equals(operator, "*")) {
        result = a1 * b1;
      } else {
        result = a1 / b1;
      }
      this.result = Double.toString(result);
      txtResult.setText(this.result);
    } catch (ArithmeticException ce) {
      txtResult.setText("除数不能为零");
    }
    if (!calculateFlag) {
      calculateFlag = true;
    }
  }

  void btnPointActionPerformed(ActionEvent e) {
    int num = txtResult.getText().indexOf(".");
    if (num < 0 && !flag) {
      txtResult.setText(txtResult.getText() + e.getActionCommand());
    }
    if (flag) {
      dotFlag = true;
    }
  }

  void btnBeginActionPerformed() {//清零运算符事件处理
    flag = false;
    dotFlag = false;
    numFlag = false;
    calculateFlag = false;
    front = "";
    behind = "";
    result = "";
    txtResult.setText("0");
  }

  void btnMinusActionPerformed() {//取反运算符事件处理
    if (txtResult.getText().equals("0")) {//如果文本框内容为0
      txtResult.setText(txtResult.getText());
    } else if (txtResult.getText().contains("-")) {//若文本框中含有负号
      String a = txtResult.getText().replaceAll("-", "");
      txtResult.setText(a);
    } else if (flag) {
      txtResult.setText("0");
    } else {
      txtResult.setText("-" + txtResult.getText());
    }
  }

  void btnCancel_actionPerformed() {//退格事件处理方法
    String str = txtResult.getText();
    if (str.length() == 1) {//如文本框中只剩下最后一个字符,将文本框内容置为0
      txtResult.setText("0");
    }
    if (str.length() > 1) {
      str = str.substring(0, str.length() - 1);
      txtResult.setText(str);
    }
  }

  public static void main(String[] args) {
    Calculator calculator = new Calculator();
    calculator.setSize(400, 310);
    calculator.setLocation(200, 150);
    calculator.setVisible(true);
  }
}