简单计算器的Java实现

来源:互联网 发布:painter软件怎么样 编辑:程序博客网 时间:2024/05/16 08:33

/*本人自学Java一月有余,对Java语法简洁、OO、功能强大深有感触,

无奈平时总是编写课本上的小程序,无法获得真正的成就感;突然想编

一个小的计算器试试,不料知识储备不够,总是在一些细节问题上纠缠。

本程序涉及到正则表达式在split中的应用,无奈之下只好采用迂回战术。

先把*等特殊字符替换成其他字符后才用split,之后再换回来replace()*/

package caculator;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleCaculator extends JFrame {
 //define component
 private JButton jbtReminder = new JButton("%");
 private JButton jbtClear = new JButton("CLR");
 
 private JButton jbtAdd = new JButton("+");
 private JButton jbtSubtract = new JButton("-");
 private JButton jbtMultiply = new JButton("*");
 private JButton jbtDivide = new JButton("/");
 
 JButton[] jbtArray = new JButton[10];
 private JButton jbtDot = new JButton(".");
 private JButton jbtEqual = new JButton("=");

 private JTextField jtfDisplay = new JTextField(25);
 
    public SimpleCaculator(){
    //The size of a button
     Dimension d = new Dimension(100,40);
    
     //The panel with three buttons,including one not enabled
  JPanel panelCenter = new JPanel(new BorderLayout());
 
  //set size
  jbtReminder.setPreferredSize(d);
  panelCenter.add(jbtReminder,BorderLayout.WEST);
  JButton jbt = new JButton();
  jbt.setEnabled(false);
  panelCenter.add(jbt,BorderLayout.CENTER);
  jbtClear.setPreferredSize(d);
  panelCenter.add(jbtClear,BorderLayout.EAST);
 
 
  //The panel with 4 operators
  JPanel panelOperator = new JPanel(new GridLayout(4,1));
  jbtAdd.setPreferredSize(d);
  jbtSubtract.setPreferredSize(d);
  jbtMultiply.setPreferredSize(d);
  jbtDivide.setPreferredSize(d);
  panelOperator.add(jbtAdd);
  panelOperator.add(jbtSubtract);
  panelOperator.add(jbtMultiply);
  panelOperator.add(jbtDivide);
 
  //The panel with all numbers and some operators
  JPanel panelNumber = new JPanel(new GridLayout(4,3));
 
  //Add the number buttons
  for(int i = 0;i < 10;i++){
   panelNumber.add(jbtArray[i] = new JButton((10 - i -1) + ""));
   jbtArray[i].setPreferredSize(d);
  }
 
  //The dot and equal button
  jbtDot.setPreferredSize(d);
  jbtEqual.setPreferredSize(d);
  panelNumber.add(jbtDot);
  panelNumber.add(jbtEqual);
 
  //The panel not contains the textfield
     JPanel panelButton = new JPanel(new BorderLayout(3,3));
     panelButton.add(panelCenter,BorderLayout.NORTH);
     panelButton.add(panelOperator,BorderLayout.WEST);
     panelButton.add(panelNumber,BorderLayout.CENTER);
    
     //add to the frame
     jtfDisplay.setHorizontalAlignment(JTextField.RIGHT);
     add(jtfDisplay,BorderLayout.NORTH);
     add(panelButton,BorderLayout.CENTER);
    
     //Clear listener
     jbtClear.addActionListener(new ClearListener());
    
     //The string need to be displayed
     jbtReminder.addActionListener(new ContentListener());
     jbtAdd.addActionListener(new ContentListener());
     jbtSubtract.addActionListener(new ContentListener());
     jbtMultiply.addActionListener(new ContentListener());
     jbtDivide.addActionListener(new ContentListener());
     jbtDot.addActionListener(new ContentListener());
    
     for(int i = 0;i < 10;i++){
      jbtArray[i].addActionListener(new ContentListener());
  }
    
     //The equal operator listener
     jbtEqual.addActionListener(new equalListener());
   }
   
   public static void main(String[] args){
  SimpleCaculator frame = new SimpleCaculator();
  frame.setTitle("Simple Caculator");
  frame.pack();
  frame.setResizable(false);
  frame.setLocationRelativeTo(null);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
   }
  
   //Set the text null
   private class ClearListener implements ActionListener {
    public void actionPerformed(ActionEvent e){
     jtfDisplay.setText(null);
    }
   }
  
   //Append the string
   private class ContentListener implements ActionListener {
    public void actionPerformed(ActionEvent e){
      String displayString =  jtfDisplay.getText();
      displayString += ((JButton)(e.getSource())).getText();
      jtfDisplay.setText(displayString);
      }
   }
  
   //Equal listener
   private class equalListener implements ActionListener {
    public void actionPerformed(ActionEvent e){
     String displayString = jtfDisplay.getText();
    
     //Modify the string to a proper format
     String modifiedFirst;
     if(displayString.indexOf('*') != -1){
      modifiedFirst = displayString.replace('*',',');
     }
     else{
      modifiedFirst = displayString;
     }
    
     String modifiedSecond;
     if(displayString.indexOf('.') != -1){
      modifiedSecond = modifiedFirst.replace('.','d');
     }
     else{
      modifiedSecond = modifiedFirst;
     }
    
     String modifiedThird;
     if(displayString.indexOf('-') != -1){
      modifiedThird = modifiedSecond.replace('-',';');
     }
     else{
      modifiedThird = modifiedSecond;
     }
    
     //Divide the string using regular expression
     String[] numbersString = modifiedThird.split("[+;,/%]",0);
     if(numbersString[0].indexOf('d') != -1){
      numbersString[0] =  numbersString[0].replace('d','.');  
     }
    
     if(numbersString[1].indexOf('d') != -1){
      numbersString[1] = numbersString[1].replace('d','.');  
     }
    
     double result;
     char operator = displayString.charAt(numbersString[0].length());
     if(operator == ','){
      operator = '*';
     }
     if(operator == ';'){
      operator = '-';
     }
    
     //Get the result and show it
     switch (operator){
     case '+' : result = Double.parseDouble(numbersString[0]) + Double.parseDouble(numbersString[1]) ;
                jtfDisplay.setText(String.valueOf(result));
                break;
     case '-' : result = Double.parseDouble(numbersString[0]) - Double.parseDouble(numbersString[1]) ;
                      jtfDisplay.setText(String.valueOf(result));
                      break;
     case '*' : result = Double.parseDouble(numbersString[0]) * Double.parseDouble(numbersString[1]) ;
                      jtfDisplay.setText(String.valueOf(result));
                      break;
     case '/' : result = Double.parseDouble(numbersString[0]) / Double.parseDouble(numbersString[1]) ;
                      jtfDisplay.setText(String.valueOf(result));
                      break;
     case '%' :
             //When you use this operator,the numbers should be integers
             result = Integer.parseInt(numbersString[0]) % Integer.parseInt(numbersString[1]) ;
                jtfDisplay.setText(String.valueOf((int)result));
                      break;
      }
      } 
  }
}