【Java】计算器

本文详细介绍了一款简易计算器的图形用户界面(GUI)设计与实现过程。使用Java Swing构建界面,实现了基本算术运算及科学计算器功能,如平方根、存储、调用等。文章深入解析了事件监听、布局管理及运算逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备份一下很久之前写的计算器的源代码。
待完善。
GUI界面

// CalculateGUI.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CalculateGUI extends JFrame implements ActionListener{	
	JButton zero, one, two, three, four, five, six, seven,eight, nine;
	JButton point, add, sub, mul, div, equalTo, sqrt;
	JButton mc, madd, msub, mr;
	JButton delete, CE, C;
	JTextField text;
	JPanel panel;
	Operation op;
	String num = "", operator = "";
	String result = "", mresult = "";
	
	public CalculateGUI(){
		super("计算器");
		zero = new JButton("0");
		one = new JButton("1");
		two = new JButton("2");
		three = new JButton("3");
		four = new JButton("4");
		five = new JButton("5");
		six = new JButton("6");
		seven = new JButton("7");
		eight = new JButton("8");
		nine = new JButton("9");
		point = new JButton(".");
		add = new JButton("+");
		sub = new JButton("-");
		mul = new JButton("*");
		div = new JButton("/");
		equalTo = new JButton("=");
		sqrt = new JButton("√");
		delete = new JButton("←");
		CE = new JButton("CE");
		C = new JButton("C");
		mc = new JButton("mc");
		madd = new JButton("m+");
		msub = new JButton("m-");
		mr = new JButton("mr");
		
				
		text = new JTextField();
		text.setFont(new Font("宋体",Font.BOLD, 25));
		text.setHorizontalAlignment(SwingConstants.RIGHT);
		text.setColumns(2);
		
		panel = new JPanel();
	    
		panel.add(mc);
		panel.add(madd);
		panel.add(msub);
		panel.add(mr);
		panel.add(delete);
		panel.add(CE);
		panel.add(C);
		panel.add(sqrt);
		panel.add(seven);
		panel.add(eight);
		panel.add(nine);
		panel.add(div);
		panel.add(four);
		panel.add(five);
		panel.add(six);
		panel.add(mul);
		panel.add(one);
		panel.add(two);
		panel.add(three);
		panel.add(sub);
		panel.add(zero);
		panel.add(point);
		panel.add(add);
		panel.add(equalTo);
		
		panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
		panel.setLayout(new GridLayout(6, 5, 5, 5));
		
		this.setLayout(new BorderLayout());
	    this.add(text, BorderLayout.NORTH);
	    this.add(panel);
	    
		zero.addActionListener(this);
		one.addActionListener(this);
		two.addActionListener(this);
		three.addActionListener(this);
		four.addActionListener(this);
		five.addActionListener(this);
		six.addActionListener(this);
		seven.addActionListener(this);
		eight.addActionListener(this);
		nine.addActionListener(this);
		point.addActionListener(this);
		add.addActionListener(this);
		sub.addActionListener(this);
		mul.addActionListener(this);
		div.addActionListener(this);
		equalTo.addActionListener(this);
		sqrt.addActionListener(this);
		delete.addActionListener(this);
		CE.addActionListener(this);
		C.addActionListener(this);
		mc.addActionListener(this);
		madd.addActionListener(this);
		msub.addActionListener(this);
		mr.addActionListener(this);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocation(100, 200);
		this.setSize(270, 300);
		this.setVisible(true);
	}
	
	public String getResult(){
		if(operator.equals("/") && num.equals("0")) 
			text.setText("错误,除数不能为0");
		else if(operator.length() != 0 && num.length() == 0) 
			text.setText("未输入第二个操作数");
		
		/*   ↑出错       求解↓      */
		
		else if(operator.length() == 0 && num.length() != 0)
			result = num;
		else if(operator.equals("√")){
			result = String.valueOf(Math.sqrt(Double.parseDouble(num)));
			if(result.length()>15) result = result.substring(0, 15);
		}
		else{
			op.setB(Double.parseDouble(num));				    
			result = String.valueOf(op.getResult());
		}
		
		num = "";
		operator = "";
		return result;
	}
	
	//←
	public void delete(){
		if(num.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-1));
				num = num.substring(0, num.length()-1);	
		}
		else if(operator.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-1));
			num = text.getText();
			operator = "";
		}
	}
	
	//CE
	public void clearEntry(){
		if(num.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-num.length()));
			num = "";
		}
		else if(operator.length() != 0){
			text.setText(text.getText().substring(0, text.getText().length()-1));
		}
	}
	
	public String stringAdd(String str1, String str2){
		if(str1.length() == 0)
			str1 = "0";
		if(str2.length() == 0)
			str2 = "0";
		return String.valueOf(Double.parseDouble(str1)+Double.parseDouble(str2));
	}
	public String stringSub(String str1, String str2){
		return String.valueOf(Double.parseDouble(str1)-Double.parseDouble(str2));
	}
	
	/****************************事件响应***********************************/
	public void actionPerformed(ActionEvent e) {
		String str = ((AbstractButton) e.getSource()).getText();
		switch(str){
			case "0":
			case "1":
			case "2":
			case "3":
			case "4":
			case "5":
			case "6":
			case "7":
			case "8":
			case "9":
				text.setText(text.getText()+str);
				num = num + str;
				break;
			case ".":
				if(num.length() == 0)
					text.setText("数据格式错误");
				text.setText(text.getText()+str);
				num = num + str;
				break;
			case "+":
			case "-":
			case "*":
			case "/":
				if(num.length()==0) text.setText("错误,操作数为空");
				else if(operator.length() == 1)  text.setText("运算符格式错误");
				else{
					operator = str;
					op = OperateFactory.creatOperate(operator);
					op.setA(Double.parseDouble(num));
					num = "";
					text.setText(text.getText()+str);
				}
				break;
			case "√":
				operator = "√";
				text.setText("√("+text.getText()+")");
				break;
			case "=":
				result = this.getResult();
				text.setText(result);
				break;
			case "CE":
				if(num.length() != 0 | operator.length() != 0)
					this.clearEntry();
				break;
			case "C":
				text.setText("");
				num = "";
				break;
			case "←":
				this.delete();
				break;
			case "mc":
				mresult = "";
//				System.out.println("mc:   "+mresult);
				text.setText("");
				break;
			case "m+":
				result = this.getResult();
//				System.out.println("m+1:   "+mresult);
			    mresult = this.stringAdd(mresult, result);
//			    System.out.println("m+2:   "+mresult);
			    text.setText("");
			    break;
			case "m-":
				result = this.getResult();
//				System.out.println("m-1:   "+mresult);
			    mresult = this.stringSub(mresult, result);
//			    System.out.println("m-2:   "+mresult);
			    text.setText("");
			    break;
			case "mr":
//				System.out.println("mr:   "+mresult);
				if(mresult.length() != 0)
					text.setText(mresult);
				break;
		}
	}
}

\\ Operation.java

abstract class Operation{
	protected double numberA = 0, numberB = 0;
	public Operation(){}
	public Operation(double numberA, double numberB) {
		this.numberA = numberA;
		this.numberB = numberB;
	}
	public void setA(double numberA) {
		this.numberA = numberA;
	}
	public void setB(double numberB) {
		this.numberB = numberB;
	}
	public abstract double getResult();
}
//加
class OperationAdd extends Operation{
	public OperationAdd(){}
	public OperationAdd(double numberA, double numberB) {
		super(numberA, numberB);
	}
	public double getResult(){
		return numberA + numberB;
	}
}
//减
class OperationSub extends Operation{
	public OperationSub(){}
	public OperationSub(double numberA, double numberB) {
		super(numberA, numberB);
	}
	public double getResult(){
		return numberA - numberB;
	}
}
//乘
class OperationMul extends Operation{
	public OperationMul(){}
	public OperationMul(double numberA, double numberB) {
		super(numberA, numberB);
	}

	public double getResult(){
		return numberA * numberB;
	}
}
//除
class OperationDiv extends Operation{
	public OperationDiv(){}
	public OperationDiv(double numberA, double numberB) {
		super(numberA, numberB);
	}
	public double getResult() {
		 String result = String.valueOf(numberA/numberB);
		 if(result.length()>15) result = result.substring(0, 15);
		 return Double.parseDouble(result);
	}
}

class OperateFactory{
	public static Operation creatOperate(String operate){
		Operation op = null;
		switch(operate.charAt(0)){
		case '+': op = new OperationAdd();
		            break;
		case '-': op = new OperationSub();  
					break;
		case '*': op = new OperationMul();  
					break;
		case '/': op = new OperationDiv(); 
		            break;
		}
		return op;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值