一个简单的计算器

package com.xxx.calculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
/*
 * 作者:恒者
 * 功能:实现一个计算器
 * 描述:使用Swing实现,界面采用边界布局管理器和网格布局管理器;
 *     BorderLayout的NORTH部分放置一个面板,显示运算结果的文本框;CENTER部分放置一个面板,采用GridLayout布局所有按钮
 * */
public class MainFrame extends JFrame implements ActionListener {
 //初始化所有按键值
 private static final String[] KEYS = {
  "CE", "C", "Back", "%",
  "7", "8", "9", "/",
  "4", "5", "6", "*",
  "1", "2", "3", "+",
  "0", ".", "=", "-"
 };
 //按键数组
 private JButton[] buttons = new JButton[KEYS.length];
 //声明 显示结果的文本框
 private JTextField resultText;
 
 //结果数值
 private double result = 0.0;
 //是否为第一个数字
 private boolean firstNum = true;
 //记录输入的运算符,默认为"="
 private String operator = "=";
 //运算符是否有效
 private boolean operatorFlag = false;
 
 /*
  * 构造方法
  * */
 public MainFrame(){
  //设置窗口的标题,位置和大小,默认关闭方式
  setTitle("简易计算器");
  setBounds(500, 200, 290, 220);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //获取窗口容器对象,并设置其布局管理器
  Container c = getContentPane();
  c.setLayout(new BorderLayout());
  
  //设置禁止调整窗口的大小(true:可调整窗口大小,false:禁止调整窗口大小)
  setResizable(false);
  
  //创建面板,用于放置显示结果的文本框
  JPanel resultPanel = new JPanel();
  
  //创建文本框,用于显示运算结果
  resultText = new JTextField();
  //设置文本框的文本的水平对齐方式
  resultText.setHorizontalAlignment(SwingConstants.RIGHT);
  resultText.setText("0");
  resultText.setColumns(25);
  //设置文本框不可编辑
  resultText.setEditable(false);
  //将文本框添加到面板
  resultPanel.add(resultText);
  
  //将结果面板添加到窗口容器中
  c.add(resultPanel, BorderLayout.NORTH);
  
  //创建面板,用于放置所有按钮
  JPanel calcPanel = new JPanel();
  //创建一个网格布局管理器,网格行数5列数5,组件之间的水平间距5垂直间距5
  final GridLayout gridLayout = new GridLayout(5, 4, 5, 5);
  //设置面板的布局管理器
  calcPanel.setLayout(gridLayout);
  
  //通过循环创建所需的按钮
  for(int i = 0; i < KEYS.length; i++){
   //创建按钮
   buttons[i] = new JButton(KEYS[i]);
   //注册事件
   buttons[i].addActionListener(this);
   //将按钮添加到面板中
   calcPanel.add(buttons[i]);
  }
  
  //为运算符按钮添加颜色
  //"%"
  buttons[3].setForeground(Color.RED);
  //"/"
  buttons[7].setForeground(Color.RED);
  //"*"
  buttons[11].setForeground(Color.RED);
  //"+"
  buttons[15].setForeground(Color.RED);
  //"-"
  buttons[19].setForeground(Color.RED);
  
  //将按钮面板添加到窗口容器中
  c.add(calcPanel, BorderLayout.CENTER);
 }
 
 /*
  * 实现ActionListener事件监听器的接口方法actionPerformed()
  * */
 public void actionPerformed(ActionEvent e){
  //获取命令字符串
  String command = e.getActionCommand();
  //判断是否为数字键,若是,则由numberKey(command)方法处理
  if("0123456789.".indexOf(command) != -1){
   numberKey(command);
  }
  //判断是否为Back退格键,若是则有backPress(command)方法处理
  else if("Back".equals(command)){
   backPress(command);
  }
  //判断是否为CE键
  else if("CE".equals(command)){
   //清0
   resultText.setText("0");
   firstNum = true;//修复bug,之前CE后,输入数字之前添加0呈现:08
  }
  //判断是否为C键,复位键
  else if("C".equals(command)){
   //恢复初始状态
   resultText.setText("0");
   result = 0.0;
   firstNum = true;
   operator = "=";
  }
  //若是运算符,则有operatorPress(command)处理
  else{
   operatorPress(command);
  }
 }
 
 /*
  * 按下数字键
  * */
 public void numberKey(String key){
  //判断是否为第一个数
  if(firstNum){
   //若是第一个数,将输入值设置到文本框
   resultText.setText(key);
   //设置firstNum为不是第一个数表示下一次输入的数不是第一个数
   firstNum = false;
  }
  //判断当前数字是否 是小数点,且以输入的数字没有含有小数点
  else if(".".equals(key) && resultText.getText().indexOf(".") == -1){
   //获取文本框中的原有值
   String temp = resultText.getText();
   //加入小数点
   resultText.setText(temp + ".");
  }
  //不是小数点
  else if(!".".equals(key)){
   //获取文本框中的原有值
   String temp = resultText.getText();
   //加入新值
   resultText.setText(temp + key);
  }
 }
 
 /*
  * 按下退格键
  * */
 public void backPress(String key){
  //获取文本框中的数字
  String temp = resultText.getText();
  //判断是否有数字
  if(temp.length() > 0){
   //删除最后一位
   temp = temp.substring(0, temp.length()-1);
   //判断是否只有一个字符
   if(temp.length() == 0){
    //若是,文本框中数字为0
    temp = "0";
    //firstNum为true即第一个数字为真
    firstNum = true;
   }
  }
  //设置文本框中的新内容
  resultText.setText(temp);
 }
 
 /*
  * 按下运算符键
  * 注意:本次输入的运算符,保存着下次使用,本次使用上一次保存的输入运算符,第一次默认为=
  * 运算符为=时,相当于重置运算符,以进行下一次计算
  * */
 public void operatorPress(String key){
  //判断记录的运算符operator是否为加运算符"+"
  if("+".equals(operator)){
   result += getNumber();
  }
  
  //"-"
  if("-".equals(operator)){
   result -= getNumber();
  }
  
  //"*"
  if("*".equals(operator)){
   result *= getNumber();
  }
  
  //"/"
  if("/".equals(operator)){
   result /= getNumber();
  }
  
  //"%"
  if("%".equals(operator)){
   result /= 100;
  }
  
  //operator默认为"="
  if("=".equals(operator)){
   result = getNumber();
  }
  
  //判断输入的运算符是否有效,默认第一次输入的运算符无效
  if(operatorFlag){
   //获取结果的long值
   long l = (long)result;
   double temp = result - l;
   //判断结果是否为整数
   if(temp == 0){
    resultText.setText(String.valueOf(l));
   }
   else{
    resultText.setText(String.valueOf(result));
   }
  }
  
  //本次输入的运算符有效(下一次判断)
  operatorFlag = true;
  //记录输入的运算符
  operator = key;
  //为第一个数
  firstNum = true;
 }
 
 /*
  * 获取文本框中的值
  * */
 public double getNumber(){
  double result = 0;
  try{
   //将文本框中的值转换为double型
   result = Double.valueOf(resultText.getText()).doubleValue();
  }
  catch(NumberFormatException e){
   e.printStackTrace();
  }
  return result;
 }
 
 /*
  * 测试结果
  * */
 public static void main(String[] args){
  //创建主窗口
  MainFrame frame = new MainFrame();
  //设置窗口可见
  frame.setVisible(true);
 }
}

你可能感兴趣的:(一个简单的计算器)