目录
项目准备
需求分析
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的基本内容,又重新开始做,虽然花了不少时间,但确实收获了很多
当时看的是下面这篇博客,豁然开朗了