使用Java编写一个简单计算器
程序编写思路:
1.页面布局
这里整体的界面采用边框布局,上方输入框和结果框采用流动布局 ;下方按键部分采用网格状布局。
2.按钮事件监听
为计算器每个按钮设置相应的事件监听,是该程序的核心部分。
①首先为0-9这10个数字键和 . + - * / ( )设置事件监听,当点击到该按键时,输入框中出现相对应的数字或符号
//各按钮的时间处理方法
public void Text(JButton button){
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String str=button.getText();
//System.out.println(str);
text.setText(text.getText() + str);
}
});
}
②其次是为MC键设置事件监听,使它完成清空输入框中数据的功能
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
text.setText("");
resulttext.setText("");
}
});
③为删除符号设置事件监听,使每次点击删除按钮,每次删除一位。
prior.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String a = text.getText();
String b = a.substring(0, a.length() - 1);
text.setText(b);
}
});
④为等于按钮设置事件监听(这是最关键的一步),使每次点击等于按钮,能正确识别算式的格式并输出正确结果。
equ.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String 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<String> 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.计算
①在计算之前,我将中缀表达式转换成了后缀表达式,又根据后缀表达式计算结果
②判定算式中运算数是否含有小数,若含有小数,进行小数计算,计算结果为double类型;若不含小数,则进行整数运算,计算结果为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"JButton
JButton jb0,jb1,jb2,jb3,jb4,jb5,jb6,jb7,jb8,jb9;
//"+,-,*,/,."JButton
JButton 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() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
text.setText("");
resulttext.setText("");
}
});
prior.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String a = text.getText();
String b = a.substring(0, a.length() - 1);
text.setText(b);
}
});
equ.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String 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() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String str=button.getText();
//System.out.println(str);
text.setText(text.getText() + str);
}
});
}
public static void main(String[] args) {
new calculator();
}
}
由于我在写这个简易计算机器软件的时候是分不同模块写的,且代码量较多,所以我只是截取了界面的源码进行展示,至于完整的源码,我已上传至我的资源中,大家可以在我的资源中进行下载。