使用Java编写一个简单计算器

使用Java编写一个简单计算器
【使用Java编写一个简单计算器】程序编写思路:
1.页面布局
这里整体的界面采用边框布局,上方输入框和结果框采用流动布局 ;下方按键部分采用网格状布局 。
2.按钮事件监听
为计算器每个按钮设置相应的事件监听,是该程序的核心部分 。
①首先为0-9这10个数字键和 . + - * / ( )设置事件监听,当点击到该按键时,输入框中出现相对应的数字或符号
//各按钮的时间处理方法public void Text(JButton button){button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubString str=button.getText();//System.out.println(str);text.setText(text.getText() + str);}});}
②其次是为MC键设置事件监听,使它完成清空输入框中数据的功能
clear.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtext.setText("");resulttext.setText("");}});
③为删除符号设置事件监听,使每次点击删除按钮,每次删除一位 。
prior.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString a = text.getText();String b = a.substring(0, a.length() - 1);text.setText(b);}});
④为等于按钮设置事件监听(这是最关键的一步),使每次点击等于按钮,能正确识别算式的格式并输出正确结果 。
equ.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString string = text.getText().trim();int flag = Format_detection.isFormate(string);if(flag == 0) {JOptionPane.showMessageDialog(null, "输入为空,请输入算式","警告",JOptionPane.ERROR_MESSAGE);}else if(flag == 1) {JOptionPane.showMessageDialog(null, "算式格式错误,请输入正确格式的算式","警告",JOptionPane.ERROR_MESSAGE);}else {getResult result = new getResult(string);resulttext.setText(result.result_int+"");}} });
3.输入算式的格式判定
该部分是避免开始盲目运算 。在计算之前先判断用户输入的算式是否符合格式,这里只是简单地格式判定,复杂的格式判定并未给出,这里是对输入为空,和输入内容的长度进行判断,当输入长度为奇数时,判定格式正确;若输入长度为偶数时,判定格式错误,并给出用户出错内容的警告 。至于更详尽的算式格式判定,并未进行 。大家可以根据需要下载源码后自行添加更多详尽的格式判定方法 。
//检测算式格式是否正确public static int isFormate(String string) {if(string.equals("") || string.isEmpty()) {flag = 0;}else {List list = new ArrayList<>();/*getResult.Infix_expression(string)函数是将算式字符串转换为以list集合存储的中缀表达式 。为后续增加更详细的格式判定提供便利 。*/list = getResult.Infix_expression(string);if(list.size()%2 == 0) {flag = 1;}else {flag = 2;}}return flag;}
4.计算
①在计算之前,我将中缀表达式转换成了后缀表达式,又根据后缀表达式计算结果
②判定算式中运算数是否含有小数,若含有小数,进行小数计算,计算结果为类型;若不含小数,则进行整数运算,计算结果为in类t型
③这里我将计算分成了正数计算(运算数中不含小数)和小数计算(运算数中含有小数) 。将计算结果以字符串的形式传入结果框中 。
程序的用户界面显示:
界面程序源代码:
//package 计算器;import java.awt.BorderLayout;import java.awt.Dialog;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Stack;import java.util.StringTokenizer;import java.util.regex.Pattern;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;public class calculator extends JFrame{JPanel viewPanel,panel;JTextField text,resulttext;JLabel label;//"0--9"JButtonJButton jb0,jb1,jb2,jb3,jb4,jb5,jb6,jb7,jb8,jb9;//"+,-,*,/,."JButtonJButton add,sub,mul,div,bot,equ,left,right,clear,prior;public calculator(){this.setBounds(300,200,400,300);this.setTitle("计算器");this.setLayout(new BorderLayout());//设置计算机窗体布局方式text =new JTextField(15);resulttext = new JTextField(15);label = new JLabel();label.setText("=");viewPanel = new JPanel();viewPanel.setLayout(new FlowLayout());viewPanel.add(text);viewPanel.add(label);viewPanel.add(resulttext);//新建数字按钮jb0 = new JButton("0");jb1 = new JButton("1");jb2 = new JButton("2");jb3 = new JButton("3");jb4 = new JButton("4");jb5 = new JButton("5");jb6 = new JButton("6");jb7 = new JButton("7");jb8 = new JButton("8");jb9 = new JButton("9");//新建符号按钮add = new JButton("+");sub = new JButton("-");mul = new JButton("*");div = new JButton("/");equ = new JButton("=");bot = new JButton(".");left = new JButton("(");right = new JButton(")");clear = new JButton("MC");prior = new JButton("←");//新建计算器数字及符号所在区域面板panel= new JPanel();panel.setLayout(new GridLayout(5,4));//讲个按钮组建放入面板//第一行panel.add(jb7);panel.add(jb8);panel.add(jb9);panel.add(div);//第二行panel.add(jb4);panel.add(jb5);panel.add(jb6);panel.add(mul);//第三行panel.add(jb1);panel.add(jb2);panel.add(jb3);panel.add(sub);//第四行panel.add(bot);panel.add(jb0);panel.add(equ);panel.add(add);//第五行panel.add(left);panel.add(right);panel.add(clear);panel.add(prior);this.add(viewPanel,BorderLayout.NORTH);this.add(panel);MyEvent();//事件处理this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置面板可关闭}public void MyEvent(){//给各数字键添加点击事件Text(jb0);Text(jb1);Text(jb2);Text(jb3);Text(jb4);Text(jb5);Text(jb6);Text(jb7);Text(jb8);Text(jb9);Text(add);Text(sub);Text(mul);Text(div);Text(bot);Text(left);Text(right);clear.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtext.setText("");resulttext.setText("");}});prior.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString a = text.getText();String b = a.substring(0, a.length() - 1);text.setText(b);}});equ.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString string = text.getText().trim();int flag = Format_detection.isFormate(string);if(flag == 0) {JOptionPane.showMessageDialog(null, "输入为空,请输入算式","警告",JOptionPane.ERROR_MESSAGE);}else if(flag == 1) {JOptionPane.showMessageDialog(null, "算式格式错误,请输入正确格式的算式","警告",JOptionPane.ERROR_MESSAGE);}else {getResult result = new getResult(string);resulttext.setText(result.result_int+"");}} });}//各按钮的时间处理方法public void Text(JButton button){button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubString str=button.getText();//System.out.println(str);text.setText(text.getText() + str);}});}public static void main(String[] args) {new calculator();}}