Java实验05(02)简单计算器

一.界面显示

二.代码

2.1.CalculatorDemo.java

/*
 * 功能:实现个性化计算器
 * 用户界面类与问题域类交互
 */

package test16_Calculator;

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

import java.awt.*;

//测试类
public class CalculatorDemo {
    
    
	public static void main(String[] args) {
    
    
		Calculator calculator = new Calculator();
	}
}

class Calculator extends JFrame implements ActionListener{
    
    
	int buttonSize = 20;
	//等号标识
	private boolean isEqual;
	String []buttonNameArray = {
    
    "7","8","9","/",
							"4","5","6","*",
							"1","2","3","-",
							"0",".","C","+",
							"圆的面积","test","test","="};
	//运算类对象
	Operation op ;
	//保存运算符
	String operator = "";
	private JButton[] buttonArray = new JButton[buttonSize];
	private JTextField displayField;
	private JPanel panel;
	public Calculator() {
    
    
		isEqual = true;
		//创建组件
		for(int i=0;i<buttonArray.length;i++) {
    
    
			buttonArray[i] = new JButton(buttonNameArray[i]);
		}
		displayField = new JTextField();
		panel = new JPanel();
		
		//字体
		Font font = new Font("宋体",Font.BOLD,16);
		Font font1 = new Font("宋体",Font.BOLD,20);
		for(int i=0;i<buttonArray.length;i++) {
    
    
			buttonArray[i].setFont(font);
		}
		displayField.setFont(font1);
		
		//文本框居左
		displayField.setHorizontalAlignment(JTextField.RIGHT);
		//初始值
		displayField.setText("0");
		//设置前景
		displayField.setForeground(Color.BLACK);
		//设置边框
		displayField.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createLineBorder(Color.black),
				BorderFactory.createEmptyBorder(5,5,5,5)));
		
		panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),
				BorderFactory.createEmptyBorder(10,10,10,10)));
		
		//设置布局
		panel.setLayout(new GridLayout(5,4,10,10));
		
		//添加组件
		this.add(displayField,BorderLayout.NORTH);
		for(int i=0;i<buttonArray.length;i++) {
    
    
			panel.add(buttonArray[i]);
		}
		this.add(panel,BorderLayout.CENTER);
		
		//设置监听
		for(int i=0;i<buttonArray.length;i++) {
    
    
			buttonArray[i].addActionListener(this);
		}
		
		//设置窗口
		//设置窗口
        this.setTitle("计算器");
        //窗口大小
        this.setSize(500,350);

        //设置窗体关闭时候,保证JVM要退出就是控制台
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取你的屏幕的宽和高
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        //然后设置你编写的窗口的初始位置,也就是在中间,
        this.setLocation(width / 2 - 200, height / 2 - 150);

        //显示
        this.setVisible(true);
		
		
	}
	
	
	//是否是双目运算符还是单目
	private int judgeOperation(String s) {
    
    
		//记录运算符的数量
		int operatorNum = 0;
		if("+-*/".indexOf(s) != -1) {
    
    
			operatorNum = 2;
		}
		else {
    
    
			if ("圆的面积".indexOf(s) != -1) {
    
    
				operatorNum = 1;
			}
			else {
    
    
				operatorNum = 0;
			}
		}
		return operatorNum;
	}
	
	@Override//重写的意思
	
	public void actionPerformed(ActionEvent e) {
    
    
		//读取文本
		String s = e.getActionCommand();
		//这里是等于-1!
		if("1234567890.=".indexOf(s) == -1) {
    
    
			operator = s;
		}
		if("C".indexOf(s) == -1) {
    
    
			operator = "";
		}
		//是数字还是小数点,不是等号
		if(judgeOperation(s) == 0 && !s.equals("=")) {
    
    
			if(isEqual) {
    
    
				displayField.setText(s);
			}
			else {
    
    
				//每按一次出现一次,拼接操作符
				displayField.setText(displayField.getText() + s);
			}
			//标志变量
			isEqual = false;
		}
		else {
    
    
			//分单目还是双目
			//是运算符按钮
			if(judgeOperation(s) != 0) {
    
    
				op = OperationFactory.createOperate(s);
				op.setNum1(Double.parseDouble(displayField.getText()));
				displayField.setText("");
			}
			else {
    
    
				//如果是等号=,且前面的运算符是双目运算符
				if(judgeOperation(operator) ==2 && s.equals("=")){
    
    
					op.setNum2(Double.parseDouble(displayField.getText()));
					//对除法的进行判断
					if(op.getNum2() == 0 && operator.equals("/")) {
    
    
						JOptionPane.showMessageDialog(null,
								"除数不能为0","提示",3);
						displayField.setText("");
					}
					else {
    
    
						double result = op.getResult();
						displayField.setText(Double.toString(result));
						isEqual = true;
					}
				}
				else
					if(s.equals("=") && judgeOperation(operator) == 1) {
    
    
						double result = op.getResult();
						displayField.setText(Double.toString(result));
						isEqual = true;
						
					}
			}
		}
	}
}

2.2.OperationFactory.java


/*
 * 功能:运算工厂类,实例化运算类
 */
package test16_Calculator;

public class OperationFactory {
    
    
	
	public static Operation createOperate(String operate) {
    
    
		Operation op = null;
		switch(operate) {
    
    
		//charAt取第一个字符
			case "+":{
    
    
				op = new OperationAdd();
				break;
			}
			case "-":{
    
    
				op = new OperationSub();
				break;
			}
			case "*":{
    
    
				op = new OperationMul();
				break;
			}
			case "/":{
    
    
				op = new OperationDiv();
				break;
			}
			case "圆的面积":{
    
    
				op = new OperationCircle();
				break;
			}
			default : break;	
		}
		return op;
	}
}

2.3.Operation.java

/*
 * 功能:运算类
 */
package test16_Calculator;

public class Operation {
    
    
	private double num1;
	private double num2;

	public double getResult() {
    
    
		return 0;
	}

	public double getNum1() {
    
    
		return num1;
	}

	public void setNum1(double num1) {
    
    
		this.num1 = num1;
	}

	public double getNum2() {
    
    
		return num2;
	}

	public void setNum2(double num2) {
    
    
		this.num2 = num2;
	}

}

// 加法类
class OperationAdd extends Operation {
    
    
	public double getResult() {
    
    
		return getNum1() + getNum2();
	}
}

// 减法类
class OperationSub extends Operation {
    
    
	public double getResult() {
    
    
		return getNum1() - getNum2();
	}
}

// 乘法类
class OperationMul extends Operation {
    
    
	public double getResult() {
    
    
		return getNum1() * getNum2();
	}
}

// 除法类
class OperationDiv extends Operation {
    
    
	public double getResult() {
    
    
		return getNum1() / getNum2();
	}
}

// 圆的面积
class OperationCircle extends Operation {
    
    
	public double getResult() {
    
    
		return getNum1() * getNum1() * Math.PI;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44179485/article/details/108400954
今日推荐