Java 用swing实现简单计算器

前言

我第一次写文章,就摸索了一会儿这个编辑器,排版可能不会太好,请见谅。主要还是上课时做了一个这个作业,个人感觉还行就分享给大家了。当然做得比我好的多了去了,我做的功能不是很多,可能还有遗留的bug,大家一起完善吧!

先看看运行的样子吧

在这里插入图片描述
色调借鉴了win10自带的计算器(我觉得挺好看的)

还是直接上代码吧

代码

感觉写得有点长,主要是为了完善功能,比如混合运算等一些细节上的问题,不知道大家有没有更好的方法。

package chap01;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Calculator extends JFrame implements ActionListener{
	private JTextField result = new JTextField("0");//结果显示
	private String[] button={" ","Backspace","CE","C","MC","7","8","9","/","sqrt","MR","4","5","6","*","%","M-","1","2","3","-","1/x","M+","0","+/-",".","+","="};
	private JButton Button[] = new JButton[button.length];//按钮组件
	private String c="";//记录当前计算符号( + - * /)
	private char[] str = new char[15];//记录输入数字
	private int x=0,y=0,flag=0;//x 数字字符数组下标,y字符串数组下标,flag 判断小数点
	private String[] number = new String[100];//存取计算数字字符串
	private double n1=0,n2=0;//运算参数
	private String M1="0",M2="0";//内存运算参数
	private int mr=0,mc=0;//记录MR、MC按钮在数组里的下标
	private JTextField M = new JTextField();
	private JTextField MM = new JTextField();
	public Calculator(){
		super("拉垮的计算器");
		Design();
	}
	//界面设计
	public void Design() {
		setSize(820,485);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(null);//绝对分布
		setBackground(new Color(202,202,202));//设置背景颜色
		result.setBounds(5, 0, 625, 70);
		result.setHorizontalAlignment(JTextField.RIGHT);//文本输出靠右
		result.setEditable(false);//不可键盘编辑
		result.setFont(new Font("黑体",Font.PLAIN,50));//设置文本字体
		result.setBorder(null);//边框透明
		add(result);//加入组件
		int x=5,y=75;
		for(int i=0;i<button.length;i++) {
			Button[i] = new JButton();
			Button[i].setText(button[i]);//按钮文本
			Button[i].setFont(new Font("黑体",Font.PLAIN,26));//设置组件字体
			Button[i].setFocusPainted(false);//设置不绘制焦点
			Button[i].setBorderPainted(false);//设置按钮边框透明
			if(y==75&&x>5) {
				Button[i].setBounds(x,y,170,70);
				Button[i].setBackground(new Color(225,225,225));//设置按钮颜色
				x+=175;
				if(x>525) {
					x=5;
					y+=75;
				}
			}
			else{
				Button[i].setBounds(x,y,100,70);
				if(button[i]==" "||button[i]=="MC"||button[i]=="MR"||button[i]=="M-"||button[i]=="M+"||button[i]=="/"||button[i]=="*"||button[i]=="-"||button[i]=="+"||button[i]=="sqrt"||button[i]=="%"||button[i]=="1/x") {
					Button[i].setBackground(new Color(225,225,225));
					if(button[i] == "MR") {
						mr = i;
						Button[i].setEnabled(false);
					}
					if(button[i] == "MC") {
						mc = i;
						Button[i].setEnabled(false);
					}
				}
				else if(button[i]=="=") {
					Button[i].setBackground(new Color(122,170,208));
				}
				else{
					Button[i].setBackground(new Color(245,245,245));
				}
				if(x<525) {
					x+=105;
				}
				else {
					x=5;
					y+=75;
				}
			}
			add(Button[i]);
		}
		for(int i=0;i<button.length;i++) {
			Button[i].addActionListener(this);//添加事件
		}
		MM.setBounds(635, 20, 185, 50);
		MM.setHorizontalAlignment(JTextField.LEFT);
		MM.setEditable(false);
		MM.setText("内存:");
		MM.setFont(new Font("黑体",Font.PLAIN,26));
		MM.setBorder(null);
		add(MM);
		M.setBounds(635, 100, 185, 275);
		M.setHorizontalAlignment(JTextField.CENTER);
		M.setEditable(false);
		M.setFont(new Font("黑体",Font.PLAIN,24));
		M.setBorder(null);
		add(M);
		number[0]="0";
		setResizable(false);//窗口用户不可放大
		setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		String s = e.getActionCommand();
		if(s=="sqrt"||s=="1/x") {
			x=0;
		}
		else if(s=="+"||s=="-"||s=="*"||s=="/") {//加减乘除运算判断
			if(y>1) {
				Result();
			}
			c=s;
			x=0;
			System.out.println(number[y]);
			if(number[y]==null) {//用于更改当前已选择运算符号时,保持y不变
				y--;
			}
			y++;
			System.out.println(number[y]);
			flag=0;
		}
		else {
			getnum(s);
		}
		switch(s){
			case " ":
				result.setText("后备隐藏能源!");//瞎搞
				break;
			case "C":
				c = "0";
				for(int i=0;i<number.length;i++) {//初始化
					number[i] = null;
				}
				number[0]="0";
				x=0;
				y=0;
				flag=0;
				result.setText(c);
				break;
			case "sqrt":
				double a1;
				if(number[y]==null) {
					a1 = Double.valueOf(number[y-1]);//String 转 double
				}
				else {
					a1 = Double.valueOf(number[y]);
				}
				if(a1<0) {
					result.setText("无效输入");
				}
				else {
					a1 = Math.sqrt(a1);
					result.setText(Judge(a1));
					number[y] = String.valueOf(a1);
				}
				break;
			case "%":
				switch(c) {
					case "+":
						n1 = Double.valueOf(number[y-1]);
						n2 = Double.valueOf(number[y]);
						n2 = n1*n2/100;
						result.setText(Judge(n2));
						number[y] = String.valueOf(n2);
						break;
					case "-":
						n1 = Double.valueOf(number[y-1]);
						n2 = Double.valueOf(number[y]);
						n2 = n1*n2/100;
						result.setText(Judge(n2));
						number[y] = String.valueOf(n2);
						break;
					case "*":
						n2 = Double.valueOf(number[y]);
						n2 = n2/100;
						result.setText(Judge(n2));
						number[y] = String.valueOf(n2);
						break;
					case "/":
						n2 = Double.valueOf(number[y]);
						n2 = n2/100;
						result.setText(Judge(n2));
						number[y] = String.valueOf(n2);
						break;
				}
				break;
			case "+/-":
				double a4 = Double.valueOf(number[y]);
				a4=-a4;
				if(a4<0) {
					for(int i=str.length-1;i>0;i--) {
						str[i]=str[i-1];
					}
					str[0]='-';
					x++;
				}
				else if(a4>0){
					for(int i=0;i<str.length-1;i++) {
						str[i]=str[i+1];
					}
					x--;
				}
				else {
					a4 = 0;//a4会出现值为-0.0的情况,所以再次使a4=0
				}
				result.setText(Judge(a4));
				number[y] = String.valueOf(a4);
				break;
			case "1/x":
				double a5;
				if(number[y]==null) {
					a5 = Double.valueOf(number[y-1]);//String 转 double
				}
				else {
					a5 = Double.valueOf(number[y]);
				}
				if(a5 == 0) {
					result.setText("除数不能为零");
				}
				else {
					a5=1/a5;
					number[y] = String.valueOf(a5);
					result.setText(Judge(a5));
				}
				break;
			case "CE":
				number[y]="0";
				result.setText(number[y]);
				x=0;
				break;
			case "Backspace":
				if(x==0) {
					result.setText("0");
				}
				else if(x==1) {
					x--;
					str[x]='0';
					number[y] = String.valueOf(str,0,x+1);
					result.setText(number[y]);
				}
				else if(x==2 && Double.valueOf(number[y])<0) {//这里是负数退格的情况处理
					x=0;
					str[x]='0';
					number[y] = String.valueOf(str,0,x+1);
					result.setText(number[y]);
				}
				else {
					x--;
					number[y] = String.valueOf(str,0,x);
					result.setText(number[y]);
				}
				break;
			
			case "=":
				Result();
				number[0] = number[y];
				for(int i=1;i<number.length;i++) {
					number[i] = null;
				}
				c = "0";
				x=0;
				y=0;
				break;
			case "M+":
				Memory("M+");
				Button[mr].setEnabled(true);
				Button[mc].setEnabled(true);
				break;
			case "M-":
				Memory("M-");
				Button[mr].setEnabled(true);
				Button[mc].setEnabled(true);
				break;
			case "MR":
				result.setText(M1);//显示内存数值
				break;
			case "MC":
				M1="0";
				M2="0";
				Button[mr].setEnabled(false);
				Button[mc].setEnabled(false);
				M.setText("");//清空内存
				break;
		}
	}
	//输入计算的数字
	public void getnum(String cc) {
		switch(cc) {
		case "0":
			str[x]='0';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "1":
			str[x]='1';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "2":
			str[x]='2';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "3":
			str[x]='3';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "4":
			str[x]='4';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "5":
			str[x]='5';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "6":
			str[x]='6';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "7":
			str[x]='7';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "8":
			str[x]='8';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case "9":
			str[x]='9';
			number[y] = String.valueOf(str,0,x+1);
			result.setText(number[y]);
			x++;
			break;
		case ".":
			if(flag==0) {
				if(x==0) {
					str[x]='0';
					str[x+1]='.';
					number[y] = String.valueOf(str,0,x+2);
					x++;
				}
				else {
					str[x]='.';
					number[y] = String.valueOf(str,0,x+1);
				}
				result.setText(number[y]);
				x++;
				flag=1;
			}
			break;
		}
	}
	//加减乘除运算结果
	public void Result(){
		switch(c) {
		case "+":
			n1= Double.valueOf(number[y-1]);
			n2= Double.valueOf(number[y]);
			n1=n1+n2;
			result.setText(Judge(n1));
			number[y] = String.valueOf(n1);
			break;
		case "-":
			n1= Double.valueOf(number[y-1]);
			n2= Double.valueOf(number[y]);
			n1=n1-n2;
			result.setText(Judge(n1));
			number[y] = String.valueOf(n1);
			break;
		case "*":
			n1= Double.valueOf(number[y-1]);
			n2= Double.valueOf(number[y]);
			n1=n1*n2;
			result.setText(Judge(n1));
			number[y] = String.valueOf(n1);
			break;
		case "/":
			n1= Double.valueOf(number[y-1]);
			n2= Double.valueOf(number[y]);
			n1=n1/n2;
			result.setText(Judge(n1));
			number[y] = String.valueOf(n1);
			break;
		}
	}
	//内存运算
	public void Memory(String string) {
		DecimalFormat format2 = new DecimalFormat(",#.#");//避免Double.valueof()无法转换带有逗号的字符串
		M2 = number[y];
		try {
			n1 = format2.parse(M1).doubleValue();
		} catch (ParseException e1) {
			// TODO 自动生成的 catch 块
			e1.printStackTrace();
		}
		n2 = Double.valueOf(M2);
		if(string == "M+") {
			n1 = n1 + n2;
		}
		else {
			n1 = n1 - n2;
		}
		M1 = Judge(n1);
		M.setText(M1);
	}
	//为了让输出的整数没有小数形式
	public String Judge(double num) {
		NumberFormat nf = NumberFormat.getInstance();//将数值转换为String类型(只保留三位小数),会舍去整数后的小数形式
		double num1 = num - (int)num;
		if(num1>0) {
			return String.valueOf(num);
		}
		else {
			return nf.format(num);
		}
	}
	//主函数
	public static void main(String args[]) {
		Calculator cl = new Calculator();
	}
}

总结

感觉直接贴个代码不太好,但我又不知该解释啥,感觉没啥内容,大家就在评论区交流吧。一起进步一起进步。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1594231563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值