JAVA实现简单计算器

JAVA实现简易计算器

用JAVA做了一个简易的计算器,可以简单逻辑运算。

由于本人新手,代码能力有限。程序健壮性还是有些许问题。

希望看到此文章的各位朋友可以在评论区里说新的好的解决方法。由衷的感谢。

(第一个问题就是每次运算都要按下等号)可能是我设计的时候就有问题。
(第二个问题是等号按下后,如果输入数字下一次的值不会覆盖,这个我曾想过使用标记,但我觉得不是可能不是最好的方式,所以没有修改)
其他问题我暂时没有排查出来。如果有,希望可以指正。

效果:JAVA实现简单计算器_第1张图片

代码如下。

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

/**
 * @author 徐平凡
 * @version 1.0
 * @date 2018.12.27
 **/
public class Compute extends JFrame {   //CFrame类继承JFrame
    private static  JPanel pan1 = new JPanel(); //创建面板对象pan1
    private static JPanel pan2 = new JPanel();  //创建面板对象pan2
    private static JTextField tf = new JTextField("0.0");    //创建文本框tf,内容为0.
    private static JTextField td = new JTextField("0.0");
    private static JButton []b = new JButton[10];   //声明按钮数组b(数字按钮)
    private static JButton bp,ba,bs,bm,bd,be,bc,bS; //声明按钮对象

    public static void main(String args[]){
        Compute frm = new Compute();//创建一个新的Compute类对象 frm
        MyActLister ac = new MyActLister();
        for(int i=0;i<=9;i++){
            b[i] = new JButton(""+i); //创建数字按钮
            b[i].setBackground(Color.CYAN); //占位数字按钮背景
            b[i].setOpaque(false); //设置透明
            b[i].addActionListener(ac);//注册监听
        }
            bp = new JButton(".");ba = new JButton("+");bs = new JButton("-");
            bm = new JButton("*");bd = new JButton("/");be = new JButton("=");
            bc = new JButton("C");bS = new JButton("BS");//创建操作符按钮

            bc.addActionListener(ac);bS.addActionListener(ac);bp.addActionListener(ac);
            ba.addActionListener(ac);bs.addActionListener(ac);bm.addActionListener(ac);
            bd.addActionListener(ac);be.addActionListener(ac);//注册监听

            bp.setBackground(Color.cyan);ba.setBackground(Color.cyan);bs.setBackground(Color.cyan);
            bm.setBackground(Color.cyan);bd.setBackground(Color.cyan);be.setBackground(Color.cyan);
            bc.setBackground(Color.cyan);bS.setBackground(Color.cyan);//占位操作符按钮背景

            bp.setOpaque(false);ba.setOpaque(false);bs.setOpaque(false);
            bm.setOpaque(false);bd.setOpaque(false);be.setOpaque(false);
            bc.setOpaque(false);bS.setOpaque(false);//设置透明

            frm.setTitle("简易计算器");//设置frame窗体标题
            frm.setLayout(null);//布局设置为空
            frm.setSize(300,250);//设置frame窗体大小
            frm.setResizable(false);//不可改变窗体大小

            GridLayout grid = new GridLayout(4,4);//创建流布局1 4*4大小
            GridLayout grid2 = new GridLayout(1,2);//创建流布局2 1*2大小

            pan1.setLayout(grid);//pan1设置为grid1布局
            pan1.setBounds(2,60,280,150);//设置pan1大小,位置
            pan1.setBackground(Color.lightGray);//pan1设置背景颜色为亮灰

            pan2.setLayout(grid2);//pan2设置为grid2布局
            pan2.setBounds(142,22,140,35);//设置pan2大小,位置
            pan2.setBackground(Color.yellow);//pan2设置背景颜色为橙色

            tf.setBounds(5,22,135,35);//设置文本框1大小,位置
            tf.setEditable(false);//设置不可编辑
            tf.setBackground(Color.BLACK);//设置文本框1背景颜色
            tf.setForeground(Color.white);//设置文本框1文字颜色为白色
            tf.setHorizontalAlignment(JTextField.RIGHT);//设置文本对齐方式右对齐

            td.setBounds(5,0,277,18);//设置文本框2大小,位置
            td.setEditable(false);//设置不可编辑
            td.setBackground(Color.PINK);//设置文本框2背景颜色
            td.setHorizontalAlignment(JTextField.RIGHT);//设置文本对齐方式右对齐

            pan1.add(b[7]);pan1.add(b[8]);pan1.add(b[9]);pan1.add(bd);
            pan1.add(b[4]);pan1.add(b[5]);pan1.add(b[6]);pan1.add(bm);
            pan1.add(b[1]);pan1.add(b[2]);pan1.add(b[3]);pan1.add(bs);
            pan1.add(b[0]);pan1.add(bp);pan1.add(be);pan1.add(ba);//pan1添加按钮
            pan2.add(bc);pan2.add(bS);//pan2添加按钮

            frm.add(td);//frm添加td
            frm.add(tf);//frm添加tf
            frm.add(pan1);//frm添加pan1
            frm.add(pan2);//frm添加pan2
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置当单击右上角的x的时候,结束程序
            frm.setVisible(true);//窗体可视化
        }
     static class MyActLister implements ActionListener { //接口ActionListener 实现它的方法
            private int oper ;//操作符种类数字表示
            private int state ;//状态数字表示
            private int operNumber;//操作符使用的次数
            private int pointNumber;//使用点按钮的次数
            private double resultA ;//使用的第一组数字
            private double resultB ;//使用的第二组数字
         private MyActLister(){ //无参构造,赋初值
                   oper = 0;
                  state = 0;
                  operNumber=0;
                resultA = 0;
                resultB = 0.0;
                pointNumber=0;
         }
         public void actionPerformed(ActionEvent e) {
             /**
              *     1.基本思路为用两个字符串变量接收2次字符串数,将其转换为Double型,进行数学运算
              *     2.通过筛选数字键和操作符键的差异,进行以下编程
              *     3.每按一次操作符之后都会接收一次当前黑色屏幕内的字符串数据,然后标记已经操作,
              *     4.当标记时,数字键盘区,第一次直接进行覆盖。然后还原标记。第二次之后默认追加,标记所用的数学计算方式
              *     5.按下等号按键之后,首先接收一次当前黑色屏幕内的字符串,然后通过标记的数学计算方式筛选运算方式
              **/

               if (e.getSource() == bp) {//当按钮为"."时
                   if (tf.getText().equals("0.0")||tf.getText().equals("0")) { //如果截取字符串为0.0时,覆盖为”0.“字符串
                       tf.setText("0.");
                       td.setText("0.");
                       pointNumber=1;
                   } else if (pointNumber == 0) {  //当按钮数字不为0时,追加字符串到tf td 按钮次数+1
                       tf.setText(tf.getText() + ".");
                       td.setText(td.getText() + ".");
                       pointNumber=1;
                   }
               } else if (e.getSource() == bc) {//当按钮为C时 对两个文本框覆盖为0.0 点击"."按钮次数重置
                   tf.setText("0.0");
                   td.setText("0.0");
                   pointNumber = 0;

               } else if (e.getSource() == bS) { //当按钮为BS时,字符串删除最右侧的字符
                   if(tf.getText().substring(tf.getText().length()).equals(".")){
                       pointNumber=0;
                   }
                   if (tf.getText().length() != 1) { //字符串长度不为1时,截取从0到字符串-1长度的字符串
                       tf.setText(tf.getText().substring(0, tf.getText().length() - 1));
                       td.setText(td.getText().substring(0, td.getText().length() - 1));
                   } else {//其他时,覆盖为0.0
                       tf.setText("0.0");
                       td.setText("0.0");
                       pointNumber=1;
                   }
               } else if (e.getSource() == ba || e.getSource() == bs ||
                       e.getSource() == bm || e.getSource() == bd) {//当按钮为+ - * /的一个
                   if (operNumber == 0) resultA = Float.valueOf(tf.getText()); //如果操作数为0时,读取tf中数据

                   if (tf.getText().equals("数据非法请按C键")) return ;//如果文本框为如下内容,返回该函数
                   if (e.getSource() == ba) {//当按钮为+时
                       oper = 1;//运算数值为1
                       td.setText(td.getText() + "+");//追加+到td文本框内容

                   }
                   if (e.getSource() == bs) {//当按钮为-时
                       oper = 2;//运算数值为2
                       td.setText(td.getText() + "-");//追加-到td文本框内容
                   }
                   if (e.getSource() == bm) {//当按钮为*时
                       oper = 3;//运算数值为3
                       td.setText(td.getText() + "*");//追加*到td文本框内容
                   }
                   if (e.getSource() == bd) {//当按钮为/时
                       oper = 4;//运算数值为4
                       td.setText(td.getText() + "/");//追加/到td文本框内容

                   }
                   state = 1;//操作状态为1
               } else if (e.getSource() == be) {
                   if (tf.getText().equals("数据非法请按C键") || tf.getText().equals("-")) //截取字符串不为数字时返回该函数
                       return;
                   resultB = Float.valueOf(tf.getText());//按下操作符后,截取字符串
                   switch (oper) {//判断oper数值,选择相应计算
                       case 0:
                           break;
                       case 1:
                           tf.setText(String.valueOf(resultA + resultB));
                           break;
                       case 2:
                           tf.setText(String.valueOf(resultA - resultB));
                           break;
                       case 3:
                           tf.setText(String.valueOf(resultA * resultB));
                           break;
                       case 4:
                           if (resultB == 0.0) {//判断除数为0时
                               tf.setText("数据非法请按C键");
                           } else {
                               tf.setText(String.valueOf(resultA / resultB));
                           }
                           break;
                   }
                   if (tf.getText().equals("数据非法请按C键")) {//当屏幕有该字符串时,清零操作数,返回该函数

                       oper = 0;
                       return;
                   }
                   resultA = Float.valueOf(tf.getText());//如果是数值,则将屏幕结果保留至resultA中
                   resultB = 0;//resultB清零
                   oper = 0;//操作数清零
               } else for (int i = 0; i < b.length; i++) {
                   if (e.getSource() == b[i]) {//当按下的键子为数字键时
                       if (td.getText().equals("0.0")) {//判断屏幕字符串是否为0.0,是的话覆盖
                           td.setText(String.valueOf(i));
                       } else {//否则追加
                           td.setText(td.getText() + String.valueOf(i));
                       }
                       if (tf.getText().equals("0.0") && oper == 0 || oper != 0 && state == 1) {//当屏幕数据不等于0.0且操作数为0(对应按下等号之后的计算)
                           // 或者操作数不为0且状态=1时(按下操作符后,需要覆盖屏幕数据,覆盖后的数据作为resultB)

                           tf.setText(String.valueOf(i));//覆盖文本
                           state = 0;//操作状态变为0
                       } else {
                           tf.setText(tf.getText() + String.valueOf(i));//否则追加
                       }
                   }

               }
              }
         }
    }

你可能感兴趣的:(java)