这个计算器是我学Java时写的第一个Swing程序,后来我读《大话设计模式》的第一章简单工厂模式恰好也是计算器,于是就改进了之前这个。
源代码下载:https://github.com/myCodingTrip/Calculator
运算类Operation.java
public abstract class Operation { protected double numberA = 0; protected double numberB = 0; protected double result = 0; public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } public abstract double getResult(); } class OperationAdd extends Operation{ @Override public double getResult() { double result = 0; result = numberA + numberB; return result; } } class OperationSub extends Operation{ @Override public double getResult() { result = numberA - numberB; return result; } } class OperationMul extends Operation{ @Override public double getResult() { result = numberA * numberB; return result; } } class OperationDiv extends Operation{ @Override public double getResult(){ try { result = numberA / numberB; } catch (Exception e) { System.out.println("除数不能为0"); e.printStackTrace(); } return result; } }
工厂类 OperationFactory.java
//简单工厂模式 //只需要传入运算符号,工厂就实例化出合适的对象,用过多态,返回父类的方式实现计算器的结果 public class OperationFactory { public static Operation createOperate(char sign) { Operation operation = null; switch (sign) { case '+': operation = new OperationAdd(); break; case '-': operation = new OperationSub(); break; case '*': operation = new OperationMul(); break; case '/': operation = new OperationDiv(); break; default: break; } return operation; } }
计算器界面CalculateFrame.java
import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; @SuppressWarnings("serial") public class CalculateFrame extends JFrame{ private JTextField textData1, textData2, textResult; private JLabel labelNum1, labelNum2, labelResult; private JRadioButton radioAdd, radioSub, radioMul, radioDiv; private JButton btnCalculate; private Operation oper; //进行运算的两个数字和结果 private String data1, data2, operation; private double resultNum; public CalculateFrame(){ //设置窗口基本属性 this.setTitle("简单计算器"); this.setSize(300, 200); //本机分辨率为1366*768 this.setLocation(1366/2-300/2, 768/2-200/2); //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { setVisible (false); System.exit(0); } }); initView(); initLayout(); this.setVisible(true);//显示窗口 btnCalculate.addActionListener(new ButtonListener()); } //设置一些功能区域 public void initView() { textData1 = new JTextField(); textData2 = new JTextField(); textResult = new JTextField(); textResult.setEnabled(false); labelNum1 = new JLabel("第一个数:"); labelNum2 = new JLabel("第二个数:"); labelResult = new JLabel("结果:"); btnCalculate = new JButton("计算"); radioAdd = new JRadioButton("+"); radioSub = new JRadioButton("-"); radioMul = new JRadioButton("*"); radioDiv = new JRadioButton("/"); } //将控件加入到布局中 public void initLayout() { JPanel p1 = new JPanel(new GridLayout(1,2)); p1.add(labelNum1); p1.add(textData1); JPanel p2 = new JPanel(new GridLayout(1,4)); p2.add(radioAdd); p2.add(radioSub); p2.add(radioMul); p2.add(radioDiv); JPanel p3 = new JPanel(new GridLayout(1,2)); p3.add(labelNum2); p3.add(textData2); JPanel p4 = new JPanel(new GridLayout(1,2)); p4.add(labelResult); p4.add(textResult); JPanel p5 = new JPanel(new GridLayout(1,1)); p5.add(btnCalculate); this.setLayout(new GridLayout(5,1)); this.add(p1); this.add(p2); this.add(p3); this.add(p4); this.add(p5); ButtonGroup group = new ButtonGroup(); group.add(radioAdd); group.add(radioSub); group.add(radioMul); group.add(radioDiv); } class ButtonListener implements ActionListener{ //从程序中读入数据 public void actionPerformed(ActionEvent e) { data1 = textData1.getText(); data2 = textData2.getText(); operation = ""; if(radioAdd.isSelected()) operation = radioAdd.getText(); else if(radioSub.isSelected()) operation = radioSub.getText(); else if(radioMul.isSelected()) operation = radioMul.getText(); else if(radioDiv.isSelected()) operation = radioDiv.getText(); //将运算符号传入工厂中进行实例化 oper = OperationFactory.createOperate(operation.charAt(0)); oper.numberA = Double.parseDouble(data1); oper.numberB = Double.parseDouble(data2); resultNum = oper.getResult(); textResult.setText(String.valueOf(resultNum)); } } }
主程序 Main.java
public class Main { public static void main(String[] args) { new CalculateFrame(); } }
程序界面: