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

tech2025-09-01  67

一.界面显示

二.代码

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; } }
最新回复(0)