Calculator

来源:互联网 发布:液压系统计算软件 编辑:程序博客网 时间:2024/05/01 09:41

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public  class Calcutor{

        private Frame frame;
       private Button backspaceButton,ceButton,cButton;
       private Panel centerPanel,northPanel,southPanel;
       private TextField tField;
      
       private String[] name ={"MC", "7", "8", "9", "/", "sqrt", "MR", "4", "5",
                                 "6", "*", "%", "MS", "1", "2", "3", "-", "1/x", "M+", "0", "+/-",
                                  ".", "+", "="};

     private Button [ ] button  = new Button[ name.length ];

     private boolean isClickOper ,isClickDot; //是否点击小数点

     private double d1 ,d2;

     private int isSave;

     private in operator;

     public Calcutor(){

     frame = new Frame("计算器");

     northPanel = new Panel();

     northPanel.setBounds(50 ,50, 280 ,80);

northPanel.setLayout(null);

  southPanel = new Panel();

  tField = new TextField("0", 30);
  tField.setBounds(10,10,260,20);
  northPanel.add(tField);

  backspaceButton = new Button("BackSpace");
  ceButton = new Button("CE");
  cButton = new Button("C");

  backspaceButton.setBounds(60,40,70,30);
  ceButton.setBounds(130,40,70,30);
  cButton.setBounds(200,40,70,30);

  northPanel.add(backspaceButton);
  northPanel.add(ceButton);
  northPanel.add(cButton);

  southPanel.setLayout(new GridLayout(4, 0, 5, 5));
  MyActionListener mal = new MyActionListener();

  backspaceButton.addActionListener(mal);
  ceButton.addActionListener(mal);
  cButton.addActionListener(mal);

  for (int i = 0; i < name.length; i++) {
   button[i] = new Button(name[i]);
   button[i].addActionListener(mal);
   southPanel.add(button[i]);
  }

  frame.add(northPanel, BorderLayout.NORTH);
  frame.add(southPanel);

  // frame.setSize(260, 245);
  frame.pack();
  frame.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent arg0) {
    frame.dispose();
   }
  });

  Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // 获取屏幕分辨率

  frame.setLocation(d.width / 2 - frame.getWidth() / 2, d.height / 2
    - frame.getHeight() / 2); // 让frame居中显示在屏幕上

  frame.setResizable(false); // 设置frame不能更改大小
  frame.setVisible(true);

 }

 class MyActionListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
   Button button = (Button) e.getSource();
   String data = button.getLabel();
   char chaData = data.charAt(0);

   String text = tField.getText();

   switch (chaData) {
   case '0':
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
    if(!isClickOper){ //此处判断是表示前一个数据是否输入结束
     if (!text.equals("0")) {
      data = text + data;
     }
    }else{ //否则表示是否开始输入后一个数据
     isClickOper = !isClickOper;
     if(isClickDot){ //输入第二个数据时,取消第二个数据的.的标示
      isClickDot = !isClickDot;
     }
    }
    tField.setText(data);
    return;
   case '.':
    if (!isClickDot) { //此处判断是防止输入多个.
     text = text + data; //将文本和按钮的.进行拼接
     tField.setText(text);
     isClickDot = !isClickDot; //表示已经输入.
    }
    return;
   case '+':
    count('+');
    return;
   case '-':
    count('-');
    return;
   case '*':
    count('*');
    return;
   case '/':
    count('/');
    return;
   case '=':
    count('=');
    return;
   }

   // 将文本区域清0
   if (data.equals("C") || data.equals("CE")) {
    initData();
    return;
   }

   // 将文本区域字符退格
   if (data.equals("BackSpace")) {
    if (!text.equals("0") && text.length() > 1) {
     text = text.substring(0, text.length() - 1);
     tField.setText(text);
    } else if (text.length() == 1) {
     initData();
    }
    return;
   }
  }
 }

 //将计算器相关逻辑数据进行初始化
 public void initData(){
  tField.setText("0");
  if (isClickDot) { // 将是否含有.的布尔值设为初始值
   isClickDot = !isClickDot;
  }
  if (isClickOper) { //将运算符标示也设为初始值
   isClickOper = !isClickOper;
  }
  d1 = d2 = 0;
  operator = '=';
  isSave = 0;
 }

 public void count(char operator){
  if(this.operator == '='){ //如果保存的前一次运算符是=号,就记住本次的运算符进行执行
   this.operator = operator;
  }
  if (!isClickOper) { //是否点击运算符
   isClickOper = !isClickOper;
   if (isSave == 0) { //isSave值为0保存第d1个,值为1保存第d2个
    d1 = Double.parseDouble(tField.getText());
    isSave = 1;
   } else {
    d2 = Double.parseDouble(tField.getText());
    switch(this.operator){ //执行前一次点击的运算符
    case '+':
     d1 = d1 + d2;
     break;
    case '-':
     d1 = d1 - d2;
     break;
    case '*':
     d1 = d1 * d2;
     break;
    case '/':
     d1 = d1 / d2;
     break;
    }
    tField.setText(String.valueOf(d1));  //在文本中显示结果
   }
   this.operator = operator; //记住点击的运算符
  }
 }

 public static void main(String[] args) {
  new Calculator();

 }

}
 

原创粉丝点击