JAVA----计算器

前言

学习了 JAVA 的 Swing 编程,不由得兴趣做了一个计算器,其中也参考了网上的一些例子,再加上自己的一些想法,花了大概半天的时间总算做出来了,总体来说,写计算器的逻辑还是让人受益匪浅的。

由于在代码中我大部分做了注释,在这里就不多说了
package calcutor;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import java.util.*;
/**
 * 计算器
 * @author Mr.W
 * @version 1.0
 */
//声明:没有按到等于号的运算称为连续运算
 class CalculatorTest implements ActionListener
{    

     JFrame f = new JFrame("计算器");
     JTextField tf = new JTextField();
     Press press = null;
    //初始化窗口,构建计算器界面
    public void init()
    {

     JPanel p1 = new JPanel();//此面板放置文本框和清除按钮

     Container ct = f.getContentPane();
     //文本框的处理
     tf.setPreferredSize(new Dimension(195,50));//设置文本框的理想大小
     tf.setHorizontalAlignment(JTextField.RIGHT);//设置文本的水平右对齐
     p1.add(tf);

     //清除按钮
     JButton C = new JButton("CE");
     C.addActionListener(this);
     C.setPreferredSize(new Dimension(69,50));
     p1.add(C);
     //将画板放置在最上面,北面
     ct.add(p1,"North");

     JPanel p2 = new JPanel();  
     ct.add(p2,"Center");

     GridLayout c = new GridLayout(5,4); //网格布局           
     p2.setLayout(c); 
     //按钮的字符
     String[] str ={
                    "sqrt","^","1/x","+/-",
                    "1", "2", "3", "+", 
                    "4", "5", "6", "-" , 
                    "7", "8", "9", "x" ,  
                    ".", "0", "=", "/"
             };
     //循环添加按钮到网格布局的面板中,并设置按钮监听器
     for(int i=0 ; i<str.length ; i++){
         JButton b = new JButton(str[i]);
         p2.add(b);
         b.addActionListener(this);
     }

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口即关闭程序
        f.setSize(290,282);
        f.setVisible(true);//窗口可见

    }



public CalculatorTest(){

     press = new Press(tf);
      //其中v只存放四则运算操作,v2是存放所有操作
}

public void actionPerformed(ActionEvent e){
    //获取上次的文本框内容,也就是sum的值
        String str=tf.getText(); 
        //获得按到的键
        String er = e.getActionCommand();
        switch (er) {
        case "+":
            press.Pressplus(str);//加法
            break;
        case "-":
            press.PressCut(str);//减法
            break;
        case "x":
            press.PressMu(str);//乘法
            break;
        case "/":
            press.PressExc(str);//除法
            break;
        case "=":
            press.Pressequal(str);
            break;
        case "1/x":
            press.PressDown(str);
            break;
        case "^":
            press.Presspow(str);
            break;
        case "sqrt":
            press.Presssqrt(str);
            break;
        case "CE":
            press.PressCE();
            break;
        case "+/-":
            press.Pressagain(str);
            break;
        default:
            press.PressNum(er, str);
            break;
        }       
}



public static void main(String args[])
    {
        try {
            //界面风格
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
       new CalculatorTest().init();        
    }

}  
package calcutor;

import java.util.Vector;
import javax.swing.JTextField;

public class Press {
    private double sum=0;//用于盛放计算结果
    private double mark = 0;//盛放幂数
    private JTextField tf = null;

    private Vector<String> v=new Vector(1,1);//存放运算符操作
    private Vector<String> v2=new Vector(1,1);//存放所有操作


    public Press(JTextField tf){
        this.tf = tf;
        v2.addElement(new String("init"));//addElement添加到末尾且自动加1,默认未按键存放init
          v.addElement(new String("init"));
    }
    /*
     * 按下等于号
     */
    public void Pressequal(String str) {

             common(str);
            v.addElement(new String("="));
            v2.addElement(new String("="));             


    }
    /*
     * 按下数字键
     */
    public void PressNum(String e,String str){
//      if (e.equals("1") ||                       
//              e.equals("2") ||
//              e.equals("3") ||
//              e.equals("4") ||
//              e.equals("5") ||
//              e.equals("6") ||
//              e.equals("7") ||
//              e.equals("8") ||
//              e.equals("9") ||
//              e.equals("0") ||
//              e.equals(".")           
//             )                              //1,2,3,4,5,6,7,8,9,0,.的实现;
//          {     
              if(
                  //第一次是按数字或者在四则运算之后按数字,注意这里不包括数字前面是等于号
                  ("+").equals((String)v2.lastElement()) ||
                   ("-").equals((String)v2.lastElement()) ||
                   ("x").equals((String)v2.lastElement()) ||
                   ("/").equals((String)v2.lastElement()) ||
                   ("init").equals((String)v2.lastElement())||
                   ("sqrt").equals((String)v2.lastElement()) ||
                   ("1/x").equals((String)v2.lastElement()) ||
                   ("+/-").equals((String)v2.lastElement()) ||
                   ("CE").equals((String)v2.lastElement())
                )
              {          
                  tf.setText(e.toString());
              }
              else if(("^").equals((String)v2.lastElement())){

                  tf.setText(e.toString());
                 mark = Double.parseDouble(tf.getText());

              }
            //按了等于号后置sum为0重新开始新的计算
            else if (("=").equals((String)v2.lastElement()))
                 {
                  sum=0;
                  tf.setText(e.toString());//显示按下的数字
                 }
            //连续按下数字则连成字符串显示出来
              else
               {
                   tf.setText(tf.getText()+e.toString());//调用其父类中的getText()方法
                   mark = Double.parseDouble(tf.getText());

                }

                v2.addElement(new String(e.toString()));//将数字添加到向量中
         // }   
    }
    /**
     * 除法键
     */
    public void PressExc(String str) {    
              common(str);
              v.addElement(new String("/"));
              v2.addElement(new String("/"));              
    }
    /*
     * 按下.
     */
//  public void Presspoint(String str){
//      if((".").equals((String)v2.lastElement()
//              )
//  }
    /**
     * 公共方法
     * @param str
     */

    public void common(String str){
        //getActionCommand返回与此命令相关的字符串
        if(
           /**
            * 用户按了俩次运算符,包括上次的等于号,
                       也就是用户不进行连续运算时,则显示原来的数,
                       开机第一次按键   或者  第二次以后按键运算符没有连续此条件不走
                      例如6++
            */
           //lastELement指向最后一个元素
        ("+").equals((String)v2.lastElement()) ||
         ("-").equals((String)v2.lastElement()) ||
         ("x").equals((String)v2.lastElement()) ||
         ("/").equals((String)v2.lastElement()) ||
         ("=").equals((String)v2.lastElement()) ||
         ("sqrt").equals((String)v2.lastElement()) ||
         ("1/x").equals((String)v2.lastElement()) ||
         ("^").equals((String)v2.lastElement()) ||
         ("+/-").equals((String)v2.lastElement())
      )
        {

            tf.setText(String.valueOf(sum));
        }

        /**
        * 当第一次按键是+时,也只有开机第一次才会执行此语句
        */
        else if(("init").equals((String)v2.lastElement()))
        {
            tf.setText(String.valueOf(sum));//显示初始化的值
        }
            /**
            * 用户进行连续运算时
            * 或者
            * 第一次按+键时
            * (不是开机的第一次,开机的第一次按+键走上面的语句初始化文本框为0)
            * 例如 0+ 而不是+0
            */
            else
            {

                double d=Double.parseDouble(str);
                /*************!!!注意:这里不是第一次相加***************/
                //距离上次按+没有出现其他的三种运算即 X,/,-,可理解为连加
                if (("+").equals((String)v.lastElement()))
                {        
                        sum=sum+d;
                        tf.setText(String.valueOf(sum));
                }
                    //距离上次按-没有出现其他的三种运算即 X,/,+,可理解为 先减后加
                    else if (("-").equals((String)v.lastElement()))
                    {
                        //System.out.println("我连续按了俩次运算咯");
                        sum=sum-d;
                        tf.setText(String.valueOf(sum));
                    }
                    //距离上次按x没有出现其他的三种运算即 +,/,-,可理解为  先乘后加
                    else if(("x").equals((String)v.lastElement()))
                    {
                      sum=sum*d;
                      tf.setText(String.valueOf(sum));
                    }
                    //距离上次按/没有出现其他的三种运算即 X,+,-,可理解为   先除后加
                    else if(("/").equals((String)v.lastElement()))
                    {
                              sum=sum/d;
                             tf.setText(String.valueOf(sum));
                    }
                    else if(("^").equals((String)v.lastElement()))
                    {
                        Presspow();
                    }

                    else
                    {                        
                            sum=sum+d;
                             tf.setText(String.valueOf(sum));
                     }           
          }
    }
    /*
     * 按下1/x
     */
    public void PressDown(String str){

             common(str);
             sum = 1.0/sum ;
             tf.setText(String.valueOf(sum));
            v.addElement(new String("1/x"));
            v2.addElement(new String("1/x"));              

    }
    /*
     * 按下x号
     */
    public void PressMu(String str) {


             common(str);
            v.addElement(new String("x"));
            v2.addElement(new String("x"));              

    }
    /*
     * 按下sqrt
     */
    public void Presssqrt(String str){

            common(str);
            //System.out.println(sum);
            sum = Math.sqrt(sum);
            tf.setText(String.valueOf(sum));
            v.addElement(new String("sqrt"));
            v2.addElement(new String("sqrt")); 

    }
    /*
     * 按下^号
     */
    public void Presspow(String str){

            common(str);//先获得sum的值
            v.addElement(new String("^"));
            v2.addElement(new String("^"));

    }
    public void Presspow(){
        //System.out.println(sum+"sum=====mark"+mark);
        sum = Math.pow(sum, mark);
        tf.setText(String.valueOf(sum));

    }
    /**
     * 按下加号键
     */
    public void Pressplus(String str){

        common(str);
       //将分别按键添加到俩个向量去,
        v.addElement(new String("+"));
        v2.addElement(new String("+"));              


    }
    /*
     * 按下减号
     */
    public void PressCut(String str){

             common(str);
            v.addElement(new String("-"));
            v2.addElement(new String("-"));              

    }
    /**
     * 按下清除键
     */
    public void PressCE(){
            //按下了清除键就什么都没啦

                sum = 0;
                 tf.setText("0.0");
                 v.addElement(new String("CE"));
                 v2.addElement(new String("CE"));

    }
    /*
     * 按下+/-号
     */
    public void Pressagain(String str){

            common(str);
            sum =  -1.0*sum;
            tf.setText(String.valueOf(sum));
            v.addElement(new String("+/-"));
            v2.addElement(new String("+/-"));

    }


}

下面是程序运行结果哦
这里写图片描述

最近有点忙可能更新博客的速度会慢了一点,但还是会继续坚持下去的,希望每天都能进步一点点~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值