软件技术实习项目一 简单计算器的实现

目录

项目准备

算法部分的代码

GUI界面的代码

软件功能展示

界面

 功能概述

 遇到的困难和BUG

1.负号和减号的区分

2.中缀表达式转后缀表达式以及后缀表达式的计算

3.按钮监听事件

4.java swing各种组件的混合使用


项目准备

需求分析

1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示;

2.保存和浏览历史运算记录;

3.能够检验算术表达式的合法性;

4.能够实现四则混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;

5.要求交互界面友好,程序健壮。

重点

1.算法部分:中缀表达式转为后缀表达式;后缀表达式的计算;判断表达式是否合法

2.GUI界面:JAVA swing 各组件的混合运用;界面的设计

3.按钮的监听:确保用户能按照正确的规则来输入表达式

编程语言及开发工具

JAVA,IDEA

算法部分的代码

具体细节都写在代码注释里了

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Calculator {
    //给表达式补0
    public static String addZero(String s){
        if(s.charAt(0)=='-'){//如果表达式是以负号开头的,要在最前面补一个0,方便计算
            s="0"+s;
        }
        StringBuilder SB= new StringBuilder(s);
        //将表达式中的所有"(-"变为"(0-"以方便计算
        do{
            SB.insert(SB.indexOf("(-")+1,'0');
            s=SB.toString();
        }while (s.contains("(-"));
        return s;
    }

    //表达式的每一项和每个运算符存入列表
    public static List<String> stringToList(String expression) {
        String s=addZero(expression);//补0
        List<String> arrayList = new ArrayList<>();
        int index = 0;   //索引
        StringBuilder str;   //拼接多位数
        do {
            //如果是运算符(排除小数点),加入集合
            if (s.charAt(index)!=46&&(s.charAt(index) < 48 || s.charAt(index) > 57)) {
                arrayList.add(s.charAt(index) + "");
                index++;
            } else {   //是数字, 需要考虑多位数和小数点
                str = new StringBuilder();   //拼接前 先将str置空
                //没有越界,并且是数字或小数点就一直拼接
                while (index < s.length() &&( (s.charAt(index) >= 48 && s.charAt(index) <= 57)||s.charAt(index)==46)) {
                    str.append(s.charAt(index));
                    index++;
                }
                arrayList.add(str.toString());  //str 拼接完成
            }
        } while (index < s.length());
        return arrayList;
    }

    //判断是否为数字
    public static boolean isNumeric(String str) {
        String bigStr;
        try {
            bigStr = new BigDecimal(str).toString();
        } catch (Exception e) {
            return false;//异常 说明包含非数字。
        }
        return true;
    }

    //判断运算符的优先级
    private static int OperatorGrade(String item) {
        //右括号始终不入栈,所以只判断左括号
        if(item.equals("(")){
            return -1;
        }
        else if(item.equals("+")||item.equals("-")){
            return 0;
        }
        //只剩下乘号和除号了,直接返回优先级
        return 1;
    }

    //中缀表达式转后缀表达式
    public static List<String> infixToSuffix(List<String> InfixList) {
        if(InfixList==null){
            return null;
        }
        Stack<String> operatorStack = new Stack<>();   //存放符号栈
        List<String> numbersList = new ArrayList<>();  //存放数据集合
        for (String item : InfixList) {
            if (isNumeric(item)) {   //是数字,直接入数据集合
                numbersList.add(item);
            } else if (item.equals("(")) {      //是左括号,直接入符号栈
                operatorStack.push(item);
            } else if (item.equals(")")) {   //是右括号,弹出符号栈到数据集合,直到遇到左括号
                while (!operatorStack.peek().equals("(")) {  //直到遇到左括号
                    numbersList.add(operatorStack.pop());  //弹出符号栈到数据集合
                }
                operatorStack.pop();   //弹出"(",就是消除括号
            } else {   //是运算符
                //* 当item优先级小于等于operatorStack栈顶优先级,
                //* 将符号栈弹出一个加入数据集合,再将item与operatorStack下一个运算符比较,直到item大于它
                while (operatorStack.size() != 0
                        && OperatorGrade(item) <= OperatorGrade(operatorStack.peek())) {
                    numbersList.add(operatorStack.pop());
                }
                operatorStack.push(item); //最后还要将item加入符号栈
            }
        }
        while (operatorStack.size()!=0){    //将剩余在符号栈中的符号加入数据集合
            numbersList.add(operatorStack.pop());
        }
        return numbersList;   //最终集合就为后缀表达式
    }

    //计算后缀表达式
    public static String valueOfSuffix(List<String> infixListToSuffixList){
        if(infixListToSuffixList==null){
            return null;
        }
        Stack<String> Res_Stack = new Stack<String>();
        for (String item : infixListToSuffixList){
            if (isNumeric(item)){
                //数字直接入栈
                Res_Stack.push(item);
            }
            else{//是运算符
                //将栈顶的两个数弹出后,转为大数类运算(考虑到可能会有很大的数),再转为字符串入栈
                BigDecimal bd1=new BigDecimal(Res_Stack.pop());
                BigDecimal bd2=new BigDecimal(Res_Stack.pop());
                switch (item) {
                    case "+" -> Res_Stack.push(bd2.add(bd1).toString());
                    case "-" -> Res_Stack.push(bd2.subtract(bd1).toString());
                    //一开始的时候bd2和bd1的位置搞反了,导致算减法和除法时,减数变成被减数,除数变成被除数
                    case "*" -> Res_Stack.push(bd2.multiply(bd1).toString());
                    //case "/" -> Res_Stack.push(bd2.divide(bd1).toString());
                    //上面这段代码在除不尽的时候会报错
                    //保留5位且四舍五入
                    case "/" -> Res_Stack.push(bd2.divide(bd1, 5,RoundingMode.HALF_UP).toString());
                }
            }
        }
        return Res_Stack.peek();
    }

    //打印计算结果
    public static String result(String a){
        try{    //判断除数为0的情况
            valueOfSuffix(infixToSuffix(stringToList(a)));
        }catch (Exception e){

            return null;
        }
        return valueOfSuffix(infixToSuffix(stringToList(a)));
    }

}

GUI界面的代码

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Objects;
public class GUI {
    static JTextField JText = new JTextField("");//用来显示表达式和计算结果的文本框
    static JTextArea JTA =new JTextArea();//历史记录的文本区域
    static String history="";//用来存放历史记录的字符串
    static String ans;//存放计算结果
    static int left,right;//左右括号的计数器
    static int index;
    //监听各种按钮
    static class SimpleListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // 利用getActionCommand获得按钮名称
            String buttonName = e.getActionCommand();
            left=0;//左括号计数器
            right=0;//右括号计数器
            index=JText.getText().length()-1;//保存最后一个数字的下标
            StringBuilder SB=new StringBuilder(JText.getText());
            if(!JText.getText().equals("")){
                //计算括号的数量
                for(int i=JText.getText().length()-1;i>=0;i--){
                    switch (JText.getText().charAt(i)) {
                        case '(' -> left++;
                        case ')' -> right++;
                    }
                }
                //找到最后一个数字的下标
                if(!"+-*/()".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    for(;index>0;index--){
                        if("+-*/(".contains(JText.getText().charAt(index)+"")){
                            break;
                        }
                    }
                }

            }
            if (JText.getText().equals("表达式错误")) {  //清除
                ans="";
                JText.setText("");
            }
            //按下小数点
            if (buttonName.equals(".")){
                ans="";
                //前面为空或者左括号或加减乘除直接补零
                if(JText.getText().equals("") ||"+-*/(".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText()+"0.");
                }
                //前面是右括号
                else if(JText.getText().charAt(JText.getText().length()-1)==')'){
                    JText.setText(JText.getText()+"*0.");
                }
                //前面是小数点
                else if(JText.getText().charAt(JText.getText().length()-1)=='.'){
                    JText.setText(JText.getText());
                }
                //前面是数字
                else {
                    //前面是不带小数点的数字
                    if (!SB.substring(index + 1).contains(".")) {
                        JText.setText(JText.getText() + ".");
                    }
                    //前面是带小数点的数字
                    else {
                        JText.setText(JText.getText());
                    }
                }
            }
            else if (buttonName.equals("清除")) {  //清除
                ans="";
                JText.setText("");
            }
            else if (buttonName.equals("退格")) {  //退格
                ans="";
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }
                else {//若不为空则退格
                    StringBuilder sb = new StringBuilder(JText.getText());
                    JText.setText(sb.substring(0, sb.length() - 1));
                }
            }
            //等号
            else if (buttonName.equals("=")) {//等号
                ans="";
                System.out.println(JText.getText());
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }
                else if(Calculator.result(JText.getText())==null){
                    //若result返回null,则说明不能得到计算结果(错误表达式),打印错误原因
                    history+=JText.getText()+" 表达式错误\n";
                    JText.setText("表达式错误");
                }
                else if((JText.getText().charAt(JText.getText().length()-1))=='.'){//若表达式以小数点结尾
                    //若整个表达式是一个数字,直接在后面补0
                    if(Calculator.isNumeric(JText.getText())){
                        history+=JText.getText()+"="+JText.getText()+"0\n";
                        ans=JText.getText()+"0";
                        JText.setText(JText.getText()+"0");
                    }
                    else{
                        history+=JText.getText()+"="+Calculator.result(JText.getText())+"\n";
                        ans=Calculator.result(JText.getText());
                        JText.setText(Calculator.result(JText.getText()));
                    }
                }
                else if(Calculator.isNumeric(JText.getText())){//如果表达式是一个数字,则可以不计算直接打印结果
                    history+=JText.getText()+"="+JText.getText()+"\n";
                    ans=JText.getText();
                    JText.setText(JText.getText());
                }

                else{   //排除掉特殊情况后,打印计算结果并保存在历史记录里
                    history+=JText.getText()+"="+Calculator.result(JText.getText())+"\n";
                    ans=Calculator.result(JText.getText());
                    JText.setText(Calculator.result(JText.getText()));
                }
            }
            //清除历史记录
            else if(buttonName.equals("清除历史记录")){
                ans="";
                history="";
                JTA.setText("");
                JText.setText("");
            }
            //左括号
            else if(buttonName.equals("(")){
                ans="";
                if(JText.getText().equals("")){
                    JText.setText("(");
                }
                //前面是数字补乘
                else if("0123456789".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText()+"*(");
                }
                else{
                    JText.setText(JText.getText()+"(");
                }
            }
            //右括号
            else if(buttonName.equals(")")){
                ans="";
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }
                //括号匹配
                else if("+-*/(".contains(JText.getText().charAt(JText.getText().length()-1)+"")
                        ||left==right){
                    JText.setText(JText.getText());
                }
                else{
                    JText.setText(JText.getText()+")");
                }
            }
            //减号
            else if(buttonName.equals("-")){
                ans="";
                if(JText.getText().equals("")){
                    JText.setText("-");
                }
                //若前面是加减乘除,则不作响应
                else if("+-*/.".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText());
                }
                else{
                    JText.setText(JText.getText()+"-");
                }
            }
            //加减除号
            else if("+*/".contains(buttonName)){
                ans="";
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }

                //加减乘除还有左括号后面不能输入加号减号和除号(已实现)
                else if("+-*/(.".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText());
                }
                else{
                    JText.setText(JText.getText()+buttonName);
                }
            }
            //只剩下数字的情况了
            else{
                //按下数字时,如果ans不为空,则先清空JText
                if(!Objects.equals(ans, "")){
                    JText.setText(buttonName);
                    ans="";
                }
                else if(!JText.getText().equals("")){
                    if(JText.getText().charAt(JText.getText().length()-1)==')') {
                        JText.setText(JText.getText() + "*" + buttonName);
                    }
                    //若表达式为"0",则输入数字时会用新输入的数字替换这个"0"
                    else if(JText.getText().equals("0")){
                        JText.setText(buttonName);
                    }
                    else if(Calculator.isNumeric(SB.substring(index + 1))&&SB.substring(index + 1).equals("0")){
                        JText.setText(SB.substring(0,index+1)+buttonName);
                    }
                    else{
                        JText.setText(JText.getText()+buttonName);
                    }
                }
                else{
                    JText.setText(JText.getText()+buttonName);
                }
            }
        }
    }
    //计算器面板
    public static JComponent JCCAL() {
        //设置按键,看起来有点傻,其实可以将按钮名存入字符串然后用循环创建按钮,但懒得改了
        JButton JB0 = new JButton("0");
        JButton JB1 = new JButton("1");
        JButton JB2 = new JButton("2");
        JButton JB3 = new JButton("3");
        JButton JB4 = new JButton("4");
        JButton JB5 = new JButton("5");
        JButton JB6 = new JButton("6");
        JButton JB7 = new JButton("7");
        JButton JB8 = new JButton("8");
        JButton JB9 = new JButton("9");
        JButton JB10 = new JButton("+");
        JButton JB11 = new JButton("-");
        JButton JB12 = new JButton("*");
        JButton JB13 = new JButton("/");
        JButton JB14 = new JButton("(");
        JButton JB15 = new JButton(")");
        JButton JB16 = new JButton("=");
        JButton JB17 = new JButton(".");
        JButton JB18 = new JButton("退格");
        JButton JB19 = new JButton("清除");
        //显示表达式和计算结果的文本框
        Font font = new Font("宋体", Font.PLAIN, 30);
        JText.setFont(font);
        JText.setHorizontalAlignment(JTextField.RIGHT);//右对齐
        //设置计算器界面5行4列的按键网格布局
        GridLayout GL2 = new GridLayout(5, 4);
        JPanel JP0 = new JPanel(GL2);
        //因为前面没有用循环的方式创建按钮,后面只好这样写了
        JP0.add(JB13, 0);
        JP0.add(JB16, 0);
        JP0.add(JB0, 0);
        JP0.add(JB17, 0);
        JP0.add(JB12, 0);
        JP0.add(JB3, 0);
        JP0.add(JB2, 0);
        JP0.add(JB1, 0);
        JP0.add(JB11, 0);
        JP0.add(JB6, 0);
        JP0.add(JB5, 0);
        JP0.add(JB4, 0);
        JP0.add(JB10, 0);
        JP0.add(JB9, 0);
        JP0.add(JB8, 0);
        JP0.add(JB7, 0);
        JP0.add(JB19, 0);
        JP0.add(JB18, 0);
        JP0.add(JB15, 0);
        JP0.add(JB14, 0);

        SimpleListener L = new SimpleListener();//监听按钮
        JB0.addActionListener(L);
        JB1.addActionListener(L);
        JB2.addActionListener(L);
        JB3.addActionListener(L);
        JB4.addActionListener(L);
        JB5.addActionListener(L);
        JB6.addActionListener(L);
        JB7.addActionListener(L);
        JB8.addActionListener(L);
        JB9.addActionListener(L);
        JB10.addActionListener(L);
        JB11.addActionListener(L);
        JB12.addActionListener(L);
        JB13.addActionListener(L);
        JB14.addActionListener(L);
        JB15.addActionListener(L);
        JB16.addActionListener(L);
        JB17.addActionListener(L);
        JB18.addActionListener(L);
        JB19.addActionListener(L);

        JPanel JP = new JPanel();
        JP.setLayout(new BorderLayout());
        JP.add(JText, BorderLayout.NORTH);//文本框放在上方
        JP.add(JP0, BorderLayout.CENTER);//按钮放在中间
        JP.setSize(300, 400);
        return JP;

    }
    //历史记录面板
    public static JComponent JCH() {
        JButton JB = new JButton("清除历史记录");//清除历史记录按钮
        SimpleListener L = new SimpleListener();
        JB.addActionListener(L);

        Font font = new Font("宋体", Font.PLAIN, 20);
        JTA.setFont(font);
        JScrollPane JS = new JScrollPane(JTA);//设置滚动面板
        JPanel JP = new JPanel();
        JP.setLayout(new BorderLayout());
        JP.add(JS, BorderLayout.CENTER);
        JP.add(JB, BorderLayout.SOUTH);
        return JP;
    }

    public static void main(String[] args) {
        JTA.setText("");
        //选项卡面板
        JTabbedPane JT = new JTabbedPane();//选项卡面板
        JT.addTab("计算器", JCCAL());
        JT.addTab("历史记录", JCH());
        JT.setSelectedIndex(0);//将计算器设为默认选项卡
        JT.addChangeListener(new ChangeListener() {//监听选项卡的切换
            @Override
            public void stateChanged(ChangeEvent e) {
                JTA.setText(history);
            }
        });

        JFrame JF = new JFrame("计算器");//窗口
        JF.setContentPane(JT);//设置窗口的内容面板
        JF.setVisible(true);//窗口可见
        //窗口设置
        JF.setSize(300, 400);
        JF.setLocationRelativeTo(null);//窗口显示在屏幕中间
        JF.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭时结束进程
    }
}

软件功能展示

界面

        界面分为计算器界面和历史记录界面,用java swing里的JTabbedPane(选项卡面板)分隔开来,计算器界面用到了BorderLayout(边界布局),GridLayout(网格布局),JTextFiled(文本框),JButton(按钮),历史记录界面用到了BorderLayout(边界布局),JScrollPane(滚动面板),JButton(按钮),JTextArea(文本区域)

 

 功能概述

1.输入表达式合法的情况下能够正确返回表达式的值,除不尽的情况下会保留10位小数且最后一位能够四舍五入

2.能够判断表达式是否正确,例如计算括号没有补全的表达式时,会显示"表达式错误"

3.有历史记录以及清除历史记录的功能

4.输入".3"等省略整数部分的小数,会在计算时在小数点前补0

5.数字后面输入"("或者")"后面输入数字时,会自动补一个乘号

6.保证右括号的数量不能大于左括号的数量

 遇到的困难和BUG

遇到的问题基本都写在代码注释里了

1.负号和减号的区分

一开始没考虑负号和减号的区别,导致计算负数的时候会报错

解决方法:给表达式中的负号前面补0,将所有的负号转化为减号

    //给表达式补0
    public static String addZero(String s){
        if(s.charAt(0)=='-'){//如果表达式是以负号开头的,要在最前面补一个0,方便计算
            s="0"+s;
        }
        StringBuilder SB= new StringBuilder(s);
        //将表达式中的所有"(-"变为"(0-"以方便计算
        do{
            SB.insert(SB.indexOf("(-")+1,'0');
            s=SB.toString();
        }while (s.contains("(-"));
        return s;
    }

2.中缀表达式转后缀表达式以及后缀表达式的计算

考虑到输入的数字可能会很大,所以采用大数类

//中缀表达式转后缀表达式
    public static List<String> infixToSuffix(List<String> InfixList) {
        if(InfixList==null){
            return null;
        }
        Stack<String> operatorStack = new Stack<>();   //存放符号栈
        List<String> numbersList = new ArrayList<>();  //存放数据集合
        for (String item : InfixList) {
            if (isNumeric(item)) {   //是数字,直接入数据集合
                numbersList.add(item);
            } else if (item.equals("(")) {      //是左括号,直接入符号栈
                operatorStack.push(item);
            } else if (item.equals(")")) {   //是右括号,弹出符号栈到数据集合,直到遇到左括号
                while (!operatorStack.peek().equals("(")) {  //直到遇到左括号
                    numbersList.add(operatorStack.pop());  //弹出符号栈到数据集合
                }
                operatorStack.pop();   //弹出"(",就是消除括号
            } else {   //是运算符
                //* 当item优先级小于等于operatorStack栈顶优先级,
                //* 将符号栈弹出一个加入数据集合,再将item与operatorStack下一个运算符比较,直到item大于它
                while (operatorStack.size() != 0
                        && OperatorGrade(item) <= OperatorGrade(operatorStack.peek())) {
                    numbersList.add(operatorStack.pop());
                }
                operatorStack.push(item); //最后还要将item加入符号栈
            }
        }
        while (operatorStack.size()!=0){    //将剩余在符号栈中的符号加入数据集合
            numbersList.add(operatorStack.pop());
        }
        return numbersList;   //最终集合就为后缀表达式
    }

3.按钮监听事件

花了大量时间来尽量确保输入的表达式时正确的

这是整个程序中最花时间的部分了

 //监听各种按钮
    static class SimpleListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // 利用getActionCommand获得按钮名称
            String buttonName = e.getActionCommand();
            left=0;//左括号计数器
            right=0;//右括号计数器
            index=JText.getText().length()-1;//保存最后一个数字的下标
            StringBuilder SB=new StringBuilder(JText.getText());
            if(!JText.getText().equals("")){
                //计算括号的数量
                for(int i=JText.getText().length()-1;i>=0;i--){
                    switch (JText.getText().charAt(i)) {
                        case '(' -> left++;
                        case ')' -> right++;
                    }
                }
                //找到最后一个数字的下标
                if(!"+-*/()".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    for(;index>0;index--){
                        if("+-*/(".contains(JText.getText().charAt(index)+"")){
                            break;
                        }
                    }
                }

            }
            if (JText.getText().equals("表达式错误")) {  //清除
                ans="";
                JText.setText("");
            }
            //按下小数点
            if (buttonName.equals(".")){
                ans="";
                //前面为空或者左括号或加减乘除直接补零
                if(JText.getText().equals("") ||"+-*/(".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText()+"0.");
                }
                //前面是右括号
                else if(JText.getText().charAt(JText.getText().length()-1)==')'){
                    JText.setText(JText.getText()+"*0.");
                }
                //前面是小数点
                else if(JText.getText().charAt(JText.getText().length()-1)=='.'){
                    JText.setText(JText.getText());
                }
                //前面是数字
                else {
                    //前面是不带小数点的数字
                    if (!SB.substring(index + 1).contains(".")) {
                        JText.setText(JText.getText() + ".");
                    }
                    //前面是带小数点的数字
                    else {
                        JText.setText(JText.getText());
                    }
                }
            }
            else if (buttonName.equals("清除")) {  //清除
                ans="";
                JText.setText("");
            }
            else if (buttonName.equals("退格")) {  //退格
                ans="";
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }
                else {//若不为空则退格
                    StringBuilder sb = new StringBuilder(JText.getText());
                    JText.setText(sb.substring(0, sb.length() - 1));
                }
            }
            //等号
            else if (buttonName.equals("=")) {//等号
                ans="";
                System.out.println(JText.getText());
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }
                else if(Calculator.result(JText.getText())==null){
                    //若result返回null,则说明不能得到计算结果(错误表达式),打印错误原因
                    history+=JText.getText()+" 表达式错误\n";
                    JText.setText("表达式错误");
                }
                else if((JText.getText().charAt(JText.getText().length()-1))=='.'){//若表达式以小数点结尾
                    //若整个表达式是一个数字,直接在后面补0
                    if(Calculator.isNumeric(JText.getText())){
                        history+=JText.getText()+"="+JText.getText()+"0\n";
                        ans=JText.getText()+"0";
                        JText.setText(JText.getText()+"0");
                    }
                    else{
                        history+=JText.getText()+"="+Calculator.result(JText.getText())+"\n";
                        ans=Calculator.result(JText.getText());
                        JText.setText(Calculator.result(JText.getText()));
                    }
                }
                else if(Calculator.isNumeric(JText.getText())){//如果表达式是一个数字,则可以不计算直接打印结果
                    history+=JText.getText()+"="+JText.getText()+"\n";
                    ans=JText.getText();
                    JText.setText(JText.getText());
                }

                else{   //排除掉特殊情况后,打印计算结果并保存在历史记录里
                    history+=JText.getText()+"="+Calculator.result(JText.getText())+"\n";
                    ans=Calculator.result(JText.getText());
                    JText.setText(Calculator.result(JText.getText()));
                }
            }
            //清除历史记录
            else if(buttonName.equals("清除历史记录")){
                ans="";
                history="";
                JTA.setText("");
                JText.setText("");
            }
            //左括号
            else if(buttonName.equals("(")){
                ans="";
                if(JText.getText().equals("")){
                    JText.setText("(");
                }
                //前面是数字补乘
                else if("0123456789".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText()+"*(");
                }
                else{
                    JText.setText(JText.getText()+"(");
                }
            }
            //右括号
            else if(buttonName.equals(")")){
                ans="";
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }
                //括号匹配
                else if("+-*/(".contains(JText.getText().charAt(JText.getText().length()-1)+"")
                        ||left==right){
                    JText.setText(JText.getText());
                }
                else{
                    JText.setText(JText.getText()+")");
                }
            }
            //减号
            else if(buttonName.equals("-")){
                ans="";
                if(JText.getText().equals("")){
                    JText.setText("-");
                }
                //若前面是加减乘除,则不作响应
                else if("+-*/.".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText());
                }
                else{
                    JText.setText(JText.getText()+"-");
                }
            }
            //加减除号
            else if("+*/".contains(buttonName)){
                ans="";
                if(JText.getText().equals("")){ //若表达式为空,则不做响应
                    JText.setText("");
                }

                //加减乘除还有左括号后面不能输入加号减号和除号(已实现)
                else if("+-*/(.".contains(JText.getText().charAt(JText.getText().length()-1)+"")){
                    JText.setText(JText.getText());
                }
                else{
                    JText.setText(JText.getText()+buttonName);
                }
            }
            //只剩下数字的情况了
            else{
                //按下数字时,如果ans不为空,则先清空JText
                if(!Objects.equals(ans, "")){
                    JText.setText(buttonName);
                    ans="";
                }
                else if(!JText.getText().equals("")){
                    if(JText.getText().charAt(JText.getText().length()-1)==')') {
                        JText.setText(JText.getText() + "*" + buttonName);
                    }
                    //若表达式为"0",则输入数字时会用新输入的数字替换这个"0"
                    else if(JText.getText().equals("0")){
                        JText.setText(buttonName);
                    }
                    else if(Calculator.isNumeric(SB.substring(index + 1))&&SB.substring(index + 1).equals("0")){
                        JText.setText(SB.substring(0,index+1)+buttonName);
                    }
                    else{
                        JText.setText(JText.getText()+buttonName);
                    }
                }
                else{
                    JText.setText(JText.getText()+buttonName);
                }
            }
        }
    }

4.java swing各种组件的混合使用

        在做这个项目之前从来没有接触过java swing,导致刚开始做界面的时候一头雾水,做到一半做不下去了,去恶补了一下java swing的基本内容,又重新开始做,虽然花了不少时间,但确实收获了很多

当时看的是下面这篇博客,豁然开朗了

Java Swing 图形界面开发(目录)_XTS的专栏-CSDN博客_java图形开发

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值