Java实现简易计算器

利用课余时间手写了一个简易的计算器
基本思路如下
1. 首先利用java–swing建立计算器的界面
2. 实现计算逻辑

首先定义了一个body类,整个逻辑都在这一个类中完成的,最开始是用两个类分别实现逻辑的,后来不知道怎么的一直报内存溢出的错误,所以干脆就在一个类中完成了。
计算器界面的代码如下

class body{
	JFrame jframe = new JFrame();
	Container con = jframe.getContentPane();
	JButton b1 = new JButton("1");
	JButton b2 = new JButton("2");
	JButton b3 = new JButton("3");
	JButton b4 = new JButton("4");
	JButton b5 = new JButton("5");
	JButton b6 = new JButton("6");
	JButton b7 = new JButton("7");
	JButton b8 = new JButton("8");
	JButton b9 = new JButton("9");
	JButton b0 = new JButton("0");
	JButton b_multi = new JButton("*");
	JButton b_division = new JButton("/");
	JButton b_tip = new JButton(".");
	JButton b_equal = new JButton("=");
	JButton b_add = new JButton("+");
	JButton b_cut = new JButton("-");
	JButton temp = new JButton();
	//-------------------------------------//
	JPanel jp1 = new JPanel();
	JPanel jp2 = new JPanel();
	JTextField jtf = new JTextField(20);

body(){
		jframe.setTitle("my_counter");
		jframe.setVisible(true);
		jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
		jframe.add(jp1, BorderLayout.NORTH);
		jframe.setResizable(false);
		jframe.setLocation(800, 300);
		jp1.add(jtf);
		JButton bu[] = new JButton[] {b7, b8, b9, b_division, b4, b5, b6, b_multi, b1, b2, b3, b_add, b0, b_tip, b_equal, b_cut};
		for(int i=0; i<bu.length; i++) {
			bu[i].addActionListener(new jbAction());
			jp2.add(bu[i]);
		}
		jp2.setLayout(new GridLayout(4, 4));
		con.add(jp1, BorderLayout.NORTH);
		con.add(jp2, BorderLayout.SOUTH);
		jframe.pack();
	}

这里是用swing自带的pack()方法自动适应界面填充组件大小,最后实现的计算器界面非常的小(有点看不下去),如果想自己设置各组件的大小,记得要把布局管理设置为null,并且根据界面自行调整坐标(麻烦啊)…

然后是计算逻辑

class body{
	

	//创建字符串对象,用来使表达式能够完整的显示在文本框里
	StringBuffer str = new StringBuffer("");

	//实现运算逻辑所需要的变量		
	StringBuffer result=new StringBuffer("");        //用于存储左值(也是结果)和右值的累加值	
	StringBuffer right=new StringBuffer("");
	double result2;                //表达式左值,也是结果
	double right2;               //表达式右值
	String bool;             //存储运算符号
	int k1 = 0;          	//k1=0时为左值,k1=1时为中间的运算符号值,k1=2时为右值
	int k2 = 1;            //在最后输出结果的时候不让监听方法里面进入循环语句,k=1时可进入,k=0时不可进入
class jbAction implements ActionListener{
		JButton jb = new JButton();
		@Override
		public void actionPerformed(ActionEvent e) {
			jb = (JButton)e.getSource();
			if(k1 == 0 && k2 == 1){
				if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
					result2 = Double.parseDouble(result.toString());
					k1 = 1;
				}
				result.append(jb.getText());
			}
			if (k1 == 1 && k2 == 1) {
				bool = jb.getText();
				k1 = 2;
			}else if(k1 == 2 && k2 == 1){
				if(jb.getText().equals("=")){
					right2 = Double.parseDouble(right.toString());
					k2 = 0;
				}else if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){	
					right2 = Double.parseDouble(right.toString());
					fun();
					bool = jb.getText();
					right.delete(0, right.length());
				}
				if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
				}else{
					right.append(jb.getText());
				}

			}
			str.append(jb.getText());
			jtf.setText(str.toString());
			//---------------------------//
			if(jb.getText().equals("=")){
				String result3 = Double.toString(fun());
				jtf.setText(result3);
				result.delete(0, result.length());
				right.delete(0, right.length());
				str.delete(0, str.length());
				result2 = 0;
				right2 = 0;
				k1 = 0;
				k2 = 1;
			}
		}
	}
	public double fun(){
		if(bool.equals("+")){
			result2 += right2;
		}else if (bool.equals("-")) {
			result2 -= right2;
		}else if(bool.equals("*")){
			result2 *= right2;
		}else if(bool.equals("/")){
			result2 /= right2;
		}
		return result2;
	}

这里的监听器最开始是采用方法内部类写的,但是发现调用不了外部类里面定义的成员变量(不知道是方法不对还是怎么),然后就改用成员内部类写了

完整代码如下:

package my_counter;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class body{
	JFrame jframe = new JFrame();
	Container con = jframe.getContentPane();
	JButton b1 = new JButton("1");
	JButton b2 = new JButton("2");
	JButton b3 = new JButton("3");
	JButton b4 = new JButton("4");
	JButton b5 = new JButton("5");
	JButton b6 = new JButton("6");
	JButton b7 = new JButton("7");
	JButton b8 = new JButton("8");
	JButton b9 = new JButton("9");
	JButton b0 = new JButton("0");
	JButton b_multi = new JButton("*");
	JButton b_division = new JButton("/");
	JButton b_tip = new JButton(".");
	JButton b_equal = new JButton("=");
	JButton b_add = new JButton("+");
	JButton b_cut = new JButton("-");
	JButton temp = new JButton();
	//-------------------------------------//
	JPanel jp1 = new JPanel();
	JPanel jp2 = new JPanel();
	JTextField jtf = new JTextField(20);

	//创建字符串对象,用来使表达式能够完整的显示在文本框里
	StringBuffer str = new StringBuffer("");

	//实现运算逻辑所需要的变量		
	StringBuffer result=new StringBuffer("");        //用于存储左值(也是结果)和右值的累加值	
	StringBuffer right=new StringBuffer("");
	double result2;                //表达式左值,也是结果
	double right2;               //表达式右值
	String bool;             //存储运算符号
	int k1 = 0;          	//k1=0时为左值,k1=1时为中间的运算符号值,k1=2时为右值
	int k2 = 1;            //在最后输出结果的时候不让监听方法里面进入循环语句,k=1时可进入,k=0时不可进入

	//事件监听
	class jbAction implements ActionListener{
		JButton jb = new JButton();
		@Override
		public void actionPerformed(ActionEvent e) {
			jb = (JButton)e.getSource();
			if(k1 == 0 && k2 == 1){
				if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
					result2 = Double.parseDouble(result.toString());
					k1 = 1;
				}
				result.append(jb.getText());
			}
			if (k1 == 1 && k2 == 1) {
				bool = jb.getText();
				k1 = 2;
			}else if(k1 == 2 && k2 == 1){
				if(jb.getText().equals("=")){
					right2 = Double.parseDouble(right.toString());
					k2 = 0;
				}else if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){	
					right2 = Double.parseDouble(right.toString());
					fun();
					bool = jb.getText();
					right.delete(0, right.length());
				}
				if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
				}else{
					right.append(jb.getText());
				}

			}
			//使表达式能够完整显示
			str.append(jb.getText());
			jtf.setText(str.toString());
			//---------------------------//
			if(jb.getText().equals("=")){
				String result3 = Double.toString(fun());
				jtf.setText(result3);
				result.delete(0, result.length());
				right.delete(0, right.length());
				str.delete(0, str.length());
				result2 = 0;
				right2 = 0;
				k1 = 0;
				k2 = 1;
			}
		}
	}
	//构造方法,画出身体
	body(){
		jframe.setTitle("my_counter");
		jframe.setVisible(true);
		jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
		jframe.add(jp1, BorderLayout.NORTH);
		jframe.setResizable(false);
		jframe.setLocation(800, 300);
		jp1.add(jtf);
		JButton bu[] = new JButton[] {b7, b8, b9, b_division, b4, b5, b6, b_multi, b1, b2, b3, b_add, b0, b_tip, b_equal, b_cut};
		for(int i=0; i<bu.length; i++) {
			bu[i].addActionListener(new jbAction());
			jp2.add(bu[i]);
		}
		jp2.setLayout(new GridLayout(4, 4));
		con.add(jp1, BorderLayout.NORTH);
		con.add(jp2, BorderLayout.SOUTH);
		jframe.pack();
	}

	public double fun(){
		if(bool.equals("+")){
			result2 += right2;
		}else if (bool.equals("-")) {
			result2 -= right2;
		}else if(bool.equals("*")){
			result2 *= right2;
		}else if(bool.equals("/")){
			result2 /= right2;
		}
		return result2;
	}		
}

public class counter{
	public static void main(String[] args) {
		body bd = new body();
	}
}

虽然做出来了,但还是有一些不足,此计算器基本的算术要求都可以满足,但在多项式的表达式里没有乘除的优先级运算,整个表达式都是顺序执行QAQ,如有指点的意见,欢迎留言√

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值