Java实现简单计算器

第一次实现的计算器,虽然后面功能有增加但不舍得删这个版本
package test3;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

//1、主类继承窗体类
public class Calculate extends JFrame{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calculate cal=new Calculate();
		
	}

	//2、声明需要的组件
	JButton jbnum[];//声明存放代表数字的按钮数组
	JButton jboper[];//声明存放代表操作的按钮数组
	JPanel jp;//声明一个面板 放按钮组件 
	GridLayout grid;//声明网格布局 给面板
	BorderLayout border;//声明边界布局给窗体
	
	JTextField jt;
	
	int x,y;//两个操作数
	char op;//运算符
	
	//主类的构造方法
	Calculate(){
		init();
		//设置窗体属性
		this.setSize(300, 300);
		this.setLocation(300,300);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	void init(){
		//3.创建组件
		jbnum=new JButton[10];
		for(int i=0;i<10;i++)//为每个数字按钮申请空间并命名为对应数字
			jbnum[i]=new JButton(i+"");
		//为各操作符申请空间并命名
		jboper=new JButton[6];
		jboper[0]=new JButton("+");
		jboper[1]=new JButton("-");
		jboper[2]=new JButton("*");
		jboper[3]=new JButton("/");
		jboper[4]=new JButton("=");
		jboper[5]=new JButton("BackSpace");
		//为面板申请空间
		jp=new JPanel();
		grid=new GridLayout(4,4);
		border=new BorderLayout();
		
		jt=new JTextField();
		
		//将组件添加到容器
		jp.setLayout(grid);//面板设置网格布局
		jp.add(jbnum[9]);
		jp.add(jbnum[8]);
		jp.add(jbnum[7]);
		jp.add(jboper[5]);
		jp.add(jbnum[6]);
		jp.add(jbnum[5]);
		jp.add(jbnum[4]);
		jp.add(jboper[0]);
		jp.add(jbnum[3]);
		jp.add(jbnum[2]);
		jp.add(jbnum[1]);
		jp.add(jboper[1]);
		jp.add(jbnum[0]);
		jp.add(jboper[2]);
		jp.add(jboper[3]);
		jp.add(jboper[4]);
		
		this.setLayout(border);//窗体设置边界布局
		this.add(jp,BorderLayout.CENTER);//将面板添加到窗口
		this.add(jt,BorderLayout.NORTH);//将文本框添加到窗口
		
		//注册监视器
		//为数字按钮注册监视器
		numButtonListener numListener=new numButtonListener();
		for(int i=0;i<10;i++)
			jbnum[i].addActionListener(numListener);
		//为加减乘除操作符注册监视器
		operButtonListener operListener=new operButtonListener();
		for(int i=0;i<4;i++)
			jboper[i].addActionListener(operListener);
		//为退格键注册监视器
		backSpaceButtonListener backSpaceListener=new backSpaceButtonListener();
		jboper[5].addActionListener(backSpaceListener);
		//为等号键注册监视器
		equalButtonListener equalListener=new equalButtonListener();
		jboper[4].addActionListener(equalListener);
		
		
	}
	
	//实现接口 重写接口中的方法
	//数字按钮
	//只能通过退格键实现多次计算
	class numButtonListener implements ActionListener{
		//1.显示在屏幕上
		//2.更改num1或num2的值
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			String s=jt.getText();//读取当前文本框显示的内容
			boolean flag=false;//false则输入为第一个数字  true则输入为第二个数字
			for(int i=0;i<10;i++)
				if(e.getSource() == jbnum[i]) {
					//这次输入的数字是i
					jt.setText(s+i);//将输入的数字显示到文本框
					for(int j=0;j<s.length();j++)
						if(!((int)(s.charAt(j)-'0') >= 0 && (int)(s.charAt(j)-'0') <= 9)) {//已经输入了运算符且运算符在j的值
							flag=true;
							y=0;//将第二个操作数清零重新计算其值
							for(int k=j+1;k<s.length();k++)
								y=y*10+(int)(s.charAt(k)-'0');
							y=y*10+i;
						}
					//还没有输入运算符说明现在输入的是第一个操作数
					if(!flag) {
						x=0;
						for(int j=0;j<s.length();j++)
							x=x*10+(int)(s.charAt(j)-'0');
						x=x*10+i;
					}
				}
//			System.out.println("x="+x+" y="+y);
		}
		
	}
	
	//加减乘除按钮
	class operButtonListener implements ActionListener{
		//1.将运算符显示到文本框
		//2.给op赋值
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			String s=jt.getText();//读取当前文门框内容
			if(e.getSource() == jboper[0]) {
				op= '+' ;
				jt.setText(s+'+');
			}
			else if(e.getSource() == jboper[1]) {
				op = '-';
				jt.setText(s+'-');
			}
			else if(e.getSource() == jboper[2]) {
				op = '*';
				jt.setText(s+'*');
			}
			else if(e.getSource() == jboper[3]) {
				op = '/';
				jt.setText(s+'/');
			}
		}
		
	}
	
	//退格按钮
	class backSpaceButtonListener implements ActionListener{
		//修改文本框显示内容
		//修改x,y或op的值
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			String s=jt.getText();
			//求出当前文本框应显示的文本
			String curs=new String("");
			for(int i=0;i<s.length()-1;i++) curs=curs+s.charAt(i);
			jt.setText(curs);
			//修改x、y、op的值
			char last=s.charAt(s.length()-1);//当前文本框的最后一个字符
			if(!((int)(last-'0') >= 0 || (int)(last-'0') <= 9)) {//最后一个字符不是数字是字符
				op=' ';
			}
			for(int i=0;i<s.length();i++)
				if(!((int)(s.charAt(i)) >= 0 || (int)(s.charAt(i)) <= 9)) {//有字符,应该修改第二个操作数y
					y=0;
					for(int j=i+1;j<s.length()-1;j++) {
						y=y*10+(int)(s.charAt(j)-'0');
					}
				}
			//当前只输入了第一个操作数,修改x
			x=0;
			for(int i=0;i<s.length()-1;i++)
				x=x*10+(int)(s.charAt(i)-'0');
		}
		
		
	}
	
	//等号按钮
	class equalButtonListener implements ActionListener{
		//计算结果,并显示在屏幕上
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			
			
			
			double ans=0;
			if(op == '+') {
				ans=x+y;
			}
			else if(op == '-') {
				ans=x-y;
			}
			else if(op == '*') {
				ans=x*y;
			}
			else if(op == '/') {
				ans=(double)(x)/(double)(y);
			}
			jt.setText(String.valueOf(ans));
		}
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值