使用Swing实现的简单计算器

时间:2022-12-29 15:02:45

//如下先实现计算器的外壳

效果图:使用Swing实现的简单计算器

package Experiment;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.*;


public class Calculator extends JFrame {

//创建10个按钮对象,赋值0-9

   JButton []b=new JButton[10];
   {
   for(int i=0;i<b.length;i++)
   b[i]=new JButton(""+i);

   }

//创建运算符按钮

   JButton b00=new JButton("."),
       bplus=new JButton("+"),
       bminute=new JButton("-"),
       bmulti=new JButton("*"),
       bdivide=new JButton("/"),

       bequal=new JButton("=");

//创建文本域,默认值为0.

   JTextField jtf=new JTextField("0.");

//创建面板

   JPanel jp=new JPanel();

//无参的构造方法

   public Calculator(){

//面板使用网格布局 

   jp.setLayout(new GridLayout(4,4,5,5));

//将各个按钮依次加入面板

   jp.add(b[7]);jp.add(b[8]);jp.add(b[9]);jp.add(bdivide);
   jp.add(b[4]);jp.add(b[5]);jp.add(b[6]);jp.add(bmulti);
   jp.add(b[1]);jp.add(b[2]);jp.add(b[3]);jp.add(bminute);

   jp.add(b[0]);jp.add(b00);jp.add(bequal);jp.add(bplus);

//文本域向右对齐

   jtf.setHorizontalAlignment(JTextField.RIGHT);
   //将文本域置顶,面板添加在中间,JFrame默认使用的是BorderLayout布局
   add(jtf,BorderLayout.NORTH);
   add(jp,BorderLayout.CENTER);
   //注册监视器,并为每个按钮注册监听
   ButtonClickListener listener=new ButtonClickListener();
   for(int i=0;i<10;i++){
   b[i].addActionListener(listener);
   }
   b00.addActionListener(listener);
   bplus.addActionListener(listener);
   bminute.addActionListener(listener);
   bmulti.addActionListener(listener);
   bdivide.addActionListener(listener);
   bequal.addActionListener(listener);
   
   setSize(250,180);
   setLocationRelativeTo(null);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);

   }

//监听器的实现

   public class ButtonClickListener implements ActionListener{

//c创建一个空的文本对象

   JTextField jf=null;

//创建一个StringBuffer对象

   StringBuffer sb=new StringBuffer();

//自定义一个类Calculate,在这个类中实现具体的算法,此处创建这个类的对象

   Calculate cal=new Calculate();

public void actionPerformed(ActionEvent e) {

//使用e.getActionCommand()获取点击按钮内的内容

String command=e.getActionCommand();
switch(command) {
    case "1":
    case "2":  
        case "3":  
        case "4":  
        case "5":  
        case "6":  
        case "7":  
        case "8":  
        case "9":  
        case "0":  
        case ".":  
        case "+":  
        case "-":  
        case "*":  
        case "/":  
        case "%": 
    sb.append(command);  //每次点击都将获取的内容加入到StringBuffer内
    jtf.setText(sb.toString().trim());//将StringBuffer里的内容转为string类型,在文本域内显示
    break;
        case "=":
           Double a=cal.calulate(sb);  //接受Calculate返回的值
          jtf.setText(String.valueOf(a));//将Double类型的a转为string类型,显示在文本域
    }
   }
   }
   public static void main(String[] args) {
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){}
new Calculator();
}

}


//计算类的实现

package Experiment;
import java.util.*;

import javax.swing.JTextField;


public class Calculate {
//定义一个有返回值的有参方法,将从按钮类获取的计算表达式传入
      public Double calulate(StringBuffer str) {

      String string=null;       //定义一个String类型的对象

      String content=str.toString().trim();//将参数str转为string类型(表达式如:"3*4-1/2")
      List charlist=new ArrayList();  //定义集合charlist和intlist分别储存计算表达式的运算符和数字
      List intlist=new ArrayList();
      //将字符串转化为数组
      char[] ch=content.toCharArray();  //将表达式转为字符型,定义字符数组接受每个字符(如:3+42将被拆成3,+,4,2)
      //将四则运算符和数字分别加入集合charlist和intlist

      for(int i=0;i<ch.length;i++) {

           //如何ch[i]是运算符则直接加入到charlist集合中

       if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*'||ch[i]=='/') {  
       charlist.add(ch[i]);    
       }  
       else {       
       string=String.valueOf(ch[i]);  //将字符型为数字的转为字符串类型

      if(i+1>=ch.length) {           //如果i+1大于等于字符数组长度,即ch[i]已经是最后一个字符,将string

                                                                      //类型转为Double类型传入集合intlist

      intlist.add(Double.valueOf(string));

          

      }else {

//如果ch[i]不是最后一个字符,则判断下一个字符是否还是数字,如果是就将它拼接到string里,然后转为Double类型转入集合

    while(ch[i+1]!='+'&&ch[i+1]!='-'&&ch[i+1]!='*'&&ch[i+1]!='/') {
    String z=String.valueOf(ch[i+1]);    
                string=string.concat(z);
    if(i+1<ch.length) {
       i++;
    if(i+1>=ch.length) {
    break;
    }
    }
    }
    intlist.add(Double.valueOf(string));
      }            
      }
      }



//计算乘除,然后将结果返回集合intlist中,集合charlist中的乘除则移动
    for(int i=0;i<charlist.size();i++) {
    char c=(char)charlist.get(i);
      if(c=='*'||c=='/') {
      charlist.remove(i);  
      String s=intlist.get(i).toString();
      Double left=Double.valueOf(s);
      String z=intlist.get(i+1).toString();
      Double right=Double.valueOf(z);
      if(c=='*') {
      intlist.set(i,left*right);
      intlist.remove(i+1);
      }else {
      intlist.set(i,left/right);
          intlist.remove(i+1);
      }
      //*或/运算已被移除,故集合中的数向前进一步,为保证下一位不被跳过,故i--
      i--;      
      }
      }


   //当移除了charlist里面的乘除后如果还有不为空,则一定为加减字符,以下为计算加减的方法   
      while(!charlist.isEmpty()) {     
      char o=(char)charlist.remove(0);
      String s=intlist.remove(0).toString();
      Double le=Double.valueOf(s);
      Double left=le;
      String d=intlist.remove(0).toString();
      Double ri=Double.valueOf(d);
      Double right=ri;       
      if(o=='+') {
      intlist.add(0,left+right);
      }else {
      intlist.add(0,left-right);
      }     
     
       //计算完毕后,intlist内只剩下一个数字,即为最后结果,将结果转为字符串类型,再转为Double类型返回
        String a=intlist.get(0).toString();
        Double b=Double.valueOf(a);
return b; 
      }

}


第一次做,如果有什么可以改进的还望告知。