一、功能描述
1.C是清除键,功能是将之前所输入的数字、计算结果等信息全部归零
2.CE,清除当前输入的数据或符号
3.单击MS存储当前显示值,可以理解为放到存储区
4.单击MC清除存储区数值
5.单击MR将存储区数据显示到屏幕上
6.M+:当前显示的数与存储区的数相加
7.M-:当前显示的数与存储区的数相减
二、整体思路
首先对于图形显示上,底层容器采用边界布局在边界的北方和中间分别加入了两个面板。一个采用流式布局的面板添加了一个文本框,一个采用了6*5网格布局的面板添加了很多按钮。
具体实现上,对于按钮,我分成了num数字键和function功能键。创建对象时,这块代码太过冗长便把这一部分整体写成一个surface()函数。函数实现了文本框、按钮、面板的创建,菜单条的创建,同时将文本框、按钮都添加到面板中,菜单添加到菜单条中等。另外,设置了一个str字符串数组,实现存储两个操作数、操作符、暂时存储计算结果、寄存器。设置了一个布尔类型变量标志第一个数是否存在。register()函数实现对文本框、按钮注册监视器。
整体代码思想使用了getActionCommand()函数读取命令。再通过字符串函数equal()函数判断是什么符号,之后对不同符号采取不同的操作。以加法为例,通过equal函数进入到加法的分支语句,首先读取文本框内容作为第一个操作数,将字符串存入str[0],再将操作符加号存入str[1],将标志位flag1设置成true,表示存在第一个数据。文本框清空,输入第二个数据,单击“=”按钮。进入等于的分支语句,“=”按钮中对操作码进行了讨论,若为单目运算(百分数、开根号等),一个操作数即可运算;若为双目运算,需要先读取文本框的内容作为第二个操作数,存入str[2],若第一个操作数存在,两个操作数做操作码的运算,将结果存入str[4]。若第一个数据不存在,文本框输出“错误输入!”
三、具体实现代码
package sohu;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class calculate extends JFrame implements ActionListener{
JPanel jp1,jp2;//两个面板,一个放文本框,一个放按钮
JButton num[],function[];//数字键num,功能键function
JTextField jtf1;//文本框
JMenuBar jm;//菜单条
JMenu jmi1,jmi2,jmi3;//菜单
private String[] str={"","","","","",""};
//str[0]:第一个数 str[1]:运算符 str[2]:第二个数
//str[3]:MS str[4]:缓存存入MS的数
private boolean flag1=false;//是否写入第一个数
public static void main(String[] args) {
// TODO Auto-generated method stub
calculate win=new calculate();
}
void surface(){//计算器界面
num=new JButton [10];//数字键
for(int i=0;i<num.length;i++){
num[i]=new JButton(""+i);
num[i].setFont(new Font("黑体", Font.BOLD, 30));
}
function=new JButton [18];//功能键
function[0]=new JButton("MC");//清除存储区中的数值
function[0].setFont(new Font("黑体", Font.BOLD, 30));
function[1]=new JButton("MR");//将存储区的数显示到显示栏中
function[1].setFont(new Font("黑体", Font.BOLD, 30));
function[2]=new JButton("MS");//存储当前显示的值
function[2].setFont(new Font("黑体", Font.BOLD, 30));
function[3]=new JButton("M+");//当前显示的数与存储区的数相加
function[3].setFont(new Font("黑体", Font.BOLD, 30));
function[4]=new JButton("M-");//当前显示的数与存储区的数相减
function[4].setFont(new Font("黑体", Font.BOLD, 30));
function[5]=new JButton("←");//删除
function[5].setFont(new Font("黑体", Font.BOLD, 30));
function[6]=new JButton("CE");//清除当前输入的数据或符号 存储区内容不变
function[6].setFont(new Font("黑体", Font.BOLD, 30));
function[7]=new JButton("C");//将之前输入
function[7].setFont(new Font("黑体", Font.BOLD, 30));
function[8]=new JButton("±");//同时输出加和减
function[8].setFont(new Font("黑体", Font.BOLD, 30));
function[9]=new JButton("√");//求平方根
function[9].setFont(new Font("黑体", Font.BOLD, 30));
function[10]=new JButton("/");//除
function[10].setFont(new Font("黑体", Font.BOLD, 30));
function[11]=new JButton("%");//百分数
function[11].setFont(new Font("黑体", Font.BOLD, 30));
function[12]=new JButton("*");//乘
function[12].setFont(new Font("黑体", Font.BOLD, 30));
function[13]=new JButton("1/x");//取倒数
function[13].setFont(new Font("黑体", Font.BOLD, 30));
function[14]=new JButton("-");//减
function[14].setFont(new Font("黑体", Font.BOLD, 30));
function[15]=new JButton("+");//加
function[15].setFont(new Font("黑体", Font.BOLD, 30));
function[16]=new JButton(".");//小数点
function[16].setFont(new Font("黑体", Font.BOLD, 30));
function[17]=new JButton("=");//等于
function[17].setFont(new Font("黑体", Font.BOLD, 30));
jp1=new JPanel();
jp2=new JPanel();
jtf1=new JTextField(30);//文本框
jtf1.setFont(new Font("黑体", Font.BOLD, 30));
this.setLayout(new BorderLayout());//底层容器采用边界布局
jp1.setLayout(new FlowLayout());//存放文本框的面板采用流布局
jp1.add(jtf1);//文本框
jp2.setLayout(new GridLayout(6,5));//存放按钮的面板采用网格布局6*5
//向面板中添加按钮
for(int i=0;i<10;i++){
jp2.add(function[i]);
}
jp2.add(num[7]);
jp2.add(num[8]);
jp2.add(num[9]);
jp2.add(function[10]);//除
jp2.add(function[11]);//百分数
jp2.add(num[4]);
jp2.add(num[5]);
jp2.add(num[6]);
jp2.add(function[12]);//乘
jp2.add(function[13]);//取倒数
jp2.add(num[1]);
jp2.add(num[2]);
jp2.add(num[3]);
jp2.add(function[14]);//减
jp2.add(new JButton());//空
jp2.add(num[0]);
jp2.add(new JButton());//空
jp2.add(function[16]);//小数点
jp2.add(function[15]);//加
jp2.add(function[17]);//等于
//设置菜单条
jm=new JMenuBar();
jmi1=new JMenu ("查看(V)");
jmi2=new JMenu ("编辑(E)");
jmi3=new JMenu ("帮助(H)");
//向菜单条中添加菜单
jm.add(jmi1);
jm.add(jmi2);
jm.add(jmi3);
this.setJMenuBar(jm);//将菜单条加到容器中
this.add(jp1,BorderLayout.NORTH);//添加文本框面板
this.add(jp2,BorderLayout.CENTER);//添加按钮面板
}
void register(){//注册监视器
for(int i=0;i<num.length;i++){
num[i].addActionListener(this);
}
for(int i=0;i<function.length;i++){
function[i].addActionListener(this);
}
jtf1.addActionListener(this);
}
calculate(){
surface();//外观设置
register();//注册监视器
//基本属性设置
this.setTitle("计算器");
this.setSize(600,600);
this.setLocation(300,300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String ss=e.getActionCommand();//读命令
//判断命令
if(ss.equals("MC")){
str[3]="0";
}
else if(ss.equals("MR")){
jtf1.setText("");//文本框清空
jtf1.setText(str[3]);//将缓冲区数值输出到文本框中
}
else if(ss.equals("MS")){
str[3]=jtf1.getText();//将暂缓的str[4]存到寄存器中
}
else if(ss.equals("M+")){//数据与str[3]做加法
double a=Double.parseDouble(str[3]);
str[4]=jtf1.getText();
double b=Double.parseDouble(str[4]);
str[3]=""+(a+b);//将结果转为字符串,存入str[3]
str[4]=str[3];
jtf1.setText("");
jtf1.setText(str[3]);
}
else if(ss.equals("M-")){//数据与str[3]做减法
double a=Double.parseDouble(str[3]);
str[4]=jtf1.getText();
double b=Double.parseDouble(str[4]);
str[3]=""+(b-a);//将结果转为字符串,存入str[3]
str[4]=str[3];
jtf1.setText("");
jtf1.setText(str[3]);
}
else if(ss.equals("←")){//删除当先数据的一位
str[4]=jtf1.getText();
if(str[4].length()==0)
jtf1.setText("");
else{
str[4]=str[4].substring(0,str[4].length()-1);
jtf1.setText(str[4]);
}
}
else if(ss.equals("CE")){//清空当前输入文本框内容
jtf1.setText("");
}
else if(ss.equals("C")){
str[0]=str[1]=str[2]=str[4]="";//清空所有数据和符号
jtf1.setText("");
}
else if(ss.equals("±")){//同时计算加法和减法
str[0]=jtf1.getText();
if(str[0].length()==0) {
jtf1.setText("错误输入!");
}
else{
str[1]="±";
flag1=true;
jtf1.setText("");
}
}
else if(ss.equals("√")){//开根号
str[1]="√";
}
else if(ss.equals("/")){//除法
str[0]=jtf1.getText();
if(str[0].length()==0) {
jtf1.setText("错误输入!");
}
else{
str[1]="/";
flag1=true;
jtf1.setText("");
}
}
else if(ss.equals("%")){//求百分数
str[0]=jtf1.getText();
if(str[0].length()==0) {
jtf1.setText("错误输入!");
}
else{
str[1]="%";
flag1=true;
jtf1.setText("");
}
}
else if(ss.equals("*")){//乘法
str[0]=jtf1.getText();
if(str[0].length()==0)
jtf1.setText("错误输入!");
else{
str[1]="*";
flag1=true;
jtf1.setText("");
}
}
else if(ss.equals("1/x")){//除法
str[0]=jtf1.getText();
double a=Double.parseDouble(str[0]);
if(a==0)
jtf1.setText("0不能做除数");
else{
jtf1.setText(""+1/a);
}
}
else if(ss.equals("-")){//减法
str[0]=jtf1.getText();
if(str[0].length()==0)
jtf1.setText("错误输入!");
else{
str[1]="-";
flag1=true;
jtf1.setText("");
}
}
else if(ss.equals("+")){//加法
str[0]=jtf1.getText();
if(str[0].length()==0)
jtf1.setText("错误输入!");
else{
str[1]="+";
flag1=true;
jtf1.setText("");
}
}
else if(ss.equals("=")){//输出最后结果
//单目运算
if(str[1]=="√"){
str[0]=jtf1.getText();
double a=Double.parseDouble(str[0]);
if(a<0) {
jtf1.setText("错误输入!");
}
else
jtf1.setText(""+Math.sqrt(a));
}
else if(str[1].equals("1/x")){
str[0]=jtf1.getText();
double a=Double.parseDouble(str[0]);
if(a==0)
jtf1.setText("0不能做除数");
else{
jtf1.setText(""+1/a);
}
}
else if(str[1].equals("%")){
if(flag1){
double a=Double.parseDouble(str[0]);
a*=0.01;
str[4]=str[0];
jtf1.setText(""+a);
}
else
jtf1.setText("错误输入");
}
//双目运算
else if(str[1].equals("+")){
str[2]=jtf1.getText();
if(flag1==true){//第一个数据是否存在
double a=Double.parseDouble(str[0]);
double b=Double.parseDouble(str[2]);
str[4]=""+(a+b);//暂时保留结果
jtf1.setText(str[4]);
}
else{
jtf1.setText("错误输入!");
}
}
else if(str[1].equals("-")){
str[2]=jtf1.getText();
if(flag1==true){//第一个数据是否存在
double a=Double.parseDouble(str[0]);
double b=Double.parseDouble(str[2]);
str[4]=""+(a-b);//暂时保留结果
jtf1.setText(str[4]);
}
else{
jtf1.setText("错误输入!");
}
}
else if(str[1].equals("*")){
str[2]=jtf1.getText();
if(flag1==true){//第一个数据是否存在
double a=Double.parseDouble(str[0]);
double b=Double.parseDouble(str[2]);
str[4]=""+(a*b);//暂时保留结果
jtf1.setText(str[4]);
}
else{
jtf1.setText("错误输入!");
}
}
else if(str[1].equals("/")){
str[2]=jtf1.getText();
if(flag1==true){//第一个数据是否存在
double a=Double.parseDouble(str[0]);
double b=Double.parseDouble(str[2]);
if(b==0){//0不可以作为除数
jtf1.setText("0不能作为除数");
}
else{
str[4]=""+(a/b);//暂时保留结果
jtf1.setText(str[4]);
}
}
else{
jtf1.setText("错误输入!");
}
}
else if(str[1].equals("±")){//同时输出加法和减法
str[2]=jtf1.getText();
if(flag1==true){//第一个数据是否存在
double a=Double.parseDouble(str[0]);
double b=Double.parseDouble(str[2]);
str[4]=""+(a+b)+"&"+(a-b);//暂时保留结果,将结果存入str[3]无意义
jtf1.setText(str[4]);
flag1=false;
}
else{
jtf1.setText("错误输入!");
}
}
}
//在文本框显示数字
else if(ss.equals("0")){
jtf1.setText(jtf1.getText()+"0");
}
else if(ss.equals("1")){
jtf1.setText(jtf1.getText()+"1");
}
else if(ss.equals("2")){
jtf1.setText(jtf1.getText()+"2");
}
else if(ss.equals("3")){
jtf1.setText(jtf1.getText()+"3");
}
else if(ss.equals("4")){
jtf1.setText(jtf1.getText()+"4");
}
else if(ss.equals("5")){
jtf1.setText(jtf1.getText()+"5");
}
else if(ss.equals("6")){
jtf1.setText(jtf1.getText()+"6");
}
else if(ss.equals("7")){
jtf1.setText(jtf1.getText()+"7");
}
else if(ss.equals("8")){
jtf1.setText(jtf1.getText()+"8");
}
else if(ss.equals("9")){
jtf1.setText(jtf1.getText()+"9");
}
}
}
四、运行截图
整体界面:
开根号:
加减法:
2±3
MS将5263存入寄存器,MR显示出来
25与寄存器中的520相加
“<-”
52的百分数
其余功能不在这一一展示了。 文章来源:https://www.toymoban.com/news/detail-493358.html
五、代码不足
代码仍存在很多问题,例如小数点没有实现,显示“错误输入!”后如果想要重新输入数据必须先单击一下“CE”按钮或“C”按钮,不然数据会跟到“错误输入!”字符串后面,会影响之后的功能。单击清除之后不会有问题。文章来源地址https://www.toymoban.com/news/detail-493358.html
到了这里,关于JAVA简易计算器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!