[Java] 计算器 →→→→→进入此内容的聊天室

来自 , 2019-12-27, 写在 Java, 查看 168 次.
URL http://www.code666.cn/view/efb76cff
  1.     package calframe;  
  2.      
  3.     import java.awt.BorderLayout;  
  4.     import java.awt.Color;  
  5.     import java.awt.Dimension;  
  6.     import java.awt.GridLayout;  
  7.     import java.awt.event.ActionEvent;  
  8.     import java.awt.event.ActionListener;  
  9.     import java.util.Arrays;  
  10.      
  11.     import javax.swing.JButton;  
  12.     import javax.swing.JFrame;  
  13.     import javax.swing.JPanel;  
  14.     import javax.swing.JTextField;  
  15.      
  16.     public class CalFrame extends JFrame {  
  17.         /**
  18.          * 计算器的外观设计
  19.          */  
  20.         private static final long serialVersionUID = 1L;  
  21.         private final static int PRE_WIDTH = 500;  
  22.         private final static int PRE_HEIGHT = 400;  
  23.          
  24.         private JTextField text = null;  
  25.         private JButton button = null; //存储标记  
  26.          
  27.         private String[] nOp = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};  
  28.         private String[] mOp = {"MC","MR","MS","M+"};  
  29.         private String[] rOp = {"Back","CE","C"};  
  30.         private CalService service = new CalService();  
  31.          
  32.         public CalFrame(){  
  33.             this.setTitle("计算器");  
  34.             this.setSize(PRE_WIDTH, PRE_HEIGHT);  
  35.             this.setLocationRelativeTo(null);  
  36.             this.setResizable(false);  
  37.              
  38.             //添加底层  
  39.             JPanel panel = new JPanel();  
  40.             panel.setLayout(new BorderLayout(10,1));  
  41.             panel.add(getTextField(), BorderLayout.NORTH);  
  42.             panel.setPreferredSize(new Dimension(PRE_WIDTH, PRE_HEIGHT));  
  43.              
  44.             //WEST  
  45.             JButton[] mButton = getMButton();  
  46.             JPanel panel1 = new JPanel();  
  47.             panel1.setLayout(new GridLayout(5,1,0,5));  
  48.             for(JButton b : mButton ){  
  49.                 panel1.add(b);  
  50.             }  
  51.             panel.add(panel1,BorderLayout.WEST);  
  52.             //  
  53.             JButton[] rButton = getRButton();  
  54.             JPanel panel2 = new JPanel();  
  55.             panel2.setLayout(new BorderLayout(1,5));  
  56.             JPanel panel21 = new JPanel();  
  57.             panel21.setLayout(new GridLayout(1,3,3,3));  
  58.             for(JButton b : rButton){  
  59.                 panel21.add(b);  
  60.             }  
  61.             panel2.add(panel21,BorderLayout.NORTH);  
  62.              
  63.             JButton[] nButton = getNButton();  
  64.             JPanel panel22 = new JPanel();  
  65.             panel22.setLayout(new GridLayout(4,5,3,5));  
  66.             for(JButton b : nButton){  
  67.                 panel22.add(b);  
  68.             }  
  69.             panel2.add(panel22,BorderLayout.CENTER);  
  70.             panel.add(panel2,BorderLayout.CENTER);  
  71.              
  72.             this.add(panel);  
  73.             this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  
  74.             this.setVisible(true);  
  75.      
  76.              
  77.         }  
  78.         //返回显示框  
  79.         private JTextField getTextField(){  
  80.             text = new JTextField("0",10);  
  81.             //text.setSize(480, 50);  
  82.             return text;  
  83.         }  
  84.         //返回数字键  
  85.         private JButton[] getNButton(){  
  86.             String[] redButton = {"/","*","-","+","="};  
  87.             JButton[] nbutton = new JButton[nOp.length];  
  88.             for(int i = 0; i < this.nOp.length; i++){  
  89.                 JButton b = new JButton(this.nOp[i]);  
  90.                 b.addActionListener(getActionListener());  
  91.                  
  92.                 Arrays.sort(redButton);  
  93.                 if(Arrays.binarySearch(redButton, nOp[i]) >= 0){  
  94.                     b.setForeground(Color.red);  
  95.                 }else{  
  96.                     b.setForeground(Color.blue);  
  97.                 }  
  98.                 nbutton[i] = b;  
  99.             }  
  100.             return nbutton;  
  101.         }  
  102.         //返回操作健  
  103.         private JButton[] getMButton(){  
  104.             JButton[] mbutton = new JButton[mOp.length + 1];  
  105.             mbutton[0] = getButton();  
  106.             for(int i = 0; i < this.mOp.length; i++){  
  107.                 JButton b = new JButton(this.mOp[i]);  
  108.                 b.addActionListener(getActionListener());  
  109.                 b.setForeground(Color.red);  
  110.                 mbutton[i+1] = b;  
  111.             }  
  112.             return mbutton;  
  113.         }  
  114.         private JButton[] getRButton(){  
  115.             JButton[] rbutton = new JButton[rOp.length];  
  116.             for(int i = 0; i < this.rOp.length; i++){  
  117.                 JButton b = new JButton(this.rOp[i]);  
  118.                 b.addActionListener(getActionListener());  
  119.                 b.setForeground(Color.red);  
  120.                 rbutton[i] = b;  
  121.             }  
  122.             return rbutton;  
  123.         }  
  124.         private JButton getButton(){  
  125.             button = new JButton();  
  126.             return button;  
  127.         }  
  128.         private ActionListener getActionListener(){  
  129.             ActionListener actionListener = new ActionListener() {  
  130.                  
  131.                 @Override  
  132.                 public void actionPerformed(ActionEvent e) {  
  133.                     String cmd = e.getActionCommand();  
  134.                     String result = null;  
  135.                     try {  
  136.                         result = service.callMethod(cmd, text.getText());  
  137.                     } catch (Exception e2) {  
  138.                         System.out.println(e2.getMessage());  
  139.                     }  
  140.                     if(cmd.indexOf("MC") == 0){  
  141.                         button.setText("");  
  142.                     }else if(cmd.indexOf("M") == 0){  
  143.                         button.setText("M");  
  144.                     }  
  145.                     //显示计算结果  
  146.                     if(result != null){  
  147.                         text.setText(result);  
  148.                     }  
  149.                  
  150.                 }  
  151.             };  
  152.             return actionListener;  
  153.         }  
  154.         public static void main(String[] args) {  
  155.             new CalFrame();  
  156.         }  
  157.     }  
  158.  
  159.     package calframe;  
  160.      
  161.     import java.math.BigDecimal;  
  162.      
  163.     public class MyMath {  
  164.         /**
  165.          * 为一个double类型创建BigDecimal对象
  166.          */  
  167.         private static BigDecimal getBigDecimal(double number){  
  168.             return new BigDecimal(number);  
  169.         }  
  170.         public static double add(double num1, double num2) {  
  171.             BigDecimal first = getBigDecimal(num1);  
  172.             BigDecimal second = getBigDecimal(num2);  
  173.             return first.add(second).doubleValue();  
  174.         }  
  175.         public static double subtract(double num1, double num2) {  
  176.             BigDecimal first = getBigDecimal(num1);  
  177.             BigDecimal second = getBigDecimal(num2);  
  178.             return first.subtract(second).doubleValue();  
  179.         }    
  180.         public static double multiply(double num1, double num2) {  
  181.             BigDecimal first = getBigDecimal(num1);  
  182.             BigDecimal second = getBigDecimal(num2);  
  183.             return first.multiply(second).doubleValue();  
  184.         }    
  185.         public static double divide(double num1, double num2) {  
  186.             BigDecimal first = getBigDecimal(num1);  
  187.             BigDecimal second = getBigDecimal(num2);  
  188.             return first.divide(second,3,BigDecimal.ROUND_HALF_UP).doubleValue();  
  189.         }  
  190.     }  
  191.  
  192.  
  193. 最后处理按钮的事件,我们定义了一个CalService类处理业务逻辑:
  194.  
  195. [java] view plain copy
  196.  
  197.     package calframe;  
  198.      
  199.     public class CalService {  
  200.         private boolean isSecondNum = false;  
  201.         private String lastOp;  
  202.         private String firstNum = "0";  
  203.         private String secondNum = "null";  
  204.         private double store;  
  205.         private String numString = "0123456789.";  
  206.         private String opString = "+-*/";  
  207.      
  208.         public String catNum(String cmd, String text) {  
  209.             String result = cmd;  
  210.             // 如果text不等于0  
  211.             if (!"0".equals(text)) {  
  212.                 if (isSecondNum) {  
  213.                     isSecondNum = false;  
  214.                 } else {  
  215.                     result = text + cmd;  
  216.                 }  
  217.             }  
  218.             if (result.indexOf(".") == 0) {  
  219.                 result = "0" + result;  
  220.             }  
  221.             return result;  
  222.         }  
  223.      
  224.         public String setOp(String cmd, String text) {  
  225.             this.lastOp = cmd;  
  226.             this.firstNum = text;  
  227.             this.secondNum = null;  
  228.      
  229.             this.isSecondNum = true;  
  230.             return null;  
  231.         }  
  232.      
  233.         public String cal(String text, boolean isPercent) {  
  234.             double secondResult = secondNum == null ? Double.valueOf(text)  
  235.                     .doubleValue() : Double.valueOf(secondNum).doubleValue();  
  236.                      
  237.             //除数为0  
  238.             if(secondResult == 0 && this.lastOp.equals("/")){  
  239.                 return "0";  
  240.             }  
  241.              
  242.             //有%  
  243.             if(isPercent){  
  244.                 secondResult = MyMath.multiply(Double.valueOf(firstNum), MyMath.divide(secondResult, 100));  
  245.             }  
  246.             if(this.lastOp.equals("+")){  
  247.                 firstNum = String.valueOf(MyMath.add(Double.valueOf(firstNum),secondResult));  
  248.             }else if (this.lastOp.equals("-")) {  
  249.                 firstNum = String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult));  
  250.             }else if (this.lastOp.equals("*")) {  
  251.                 firstNum = String.valueOf(MyMath.multiply(Double.valueOf(firstNum),secondResult));  
  252.             }else if (this.lastOp.equals("/")) {  
  253.                 firstNum = String.valueOf(MyMath.divide(Double.valueOf(firstNum),secondResult));  
  254.             }  
  255.              
  256.             secondNum = secondNum == null ? text :secondNum;  
  257.             this.isSecondNum = true;  
  258.             return firstNum;  
  259.         }  
  260.         //求开方  
  261.         public String sqrt(String text){  
  262.             this.isSecondNum = true;  
  263.             return String.valueOf(Math.sqrt(Double.valueOf(text)));  
  264.         }  
  265.         //求倒数  
  266.         public String setReciprocal(String text){  
  267.             if (text.equals("0")){  
  268.                 return text;  
  269.             }else{  
  270.                 this.isSecondNum = true;  
  271.                 return String.valueOf(MyMath.divide(1, Double.valueOf(text)));  
  272.             }  
  273.         }  
  274.         //存储  
  275.         public String mCmd(String cmd,String text){  
  276.             if(cmd.equals("M+")){  
  277.                 store = MyMath.add(store, Double.valueOf(text));  
  278.             }else if (cmd.equals("MC")) {  
  279.                 store = 0;  
  280.             }else if (cmd.equals("MR")) {  
  281.                 isSecondNum = true;  
  282.                 return String.valueOf(store);  
  283.             }else if (cmd.equals("MS")) {  
  284.                 store = Double.valueOf(text).doubleValue();  
  285.             }  
  286.             return null;  
  287.         }  
  288.          
  289.         public String backSpace(String text){  
  290.             return text.equals("0") || text.equals("") ? "0" :text.substring(0,text.length()-1);  
  291.         }  
  292.          
  293.         public String setNegative(String text){  
  294.             if(text.indexOf("-") == 0){  
  295.                 return text.substring(1,text.length());  
  296.             }else{  
  297.                 return "-" + text;  
  298.             }  
  299.         }  
  300.         public String clearAll(){  
  301.             this.firstNum = "0";  
  302.             this.secondNum = null;  
  303.             return this.firstNum;  
  304.         }  
  305.         public String clear(String text){  
  306.             return "0";  
  307.         }  
  308.          
  309.         public String callMethod(String cmd, String text){  
  310.             if(cmd.equals("C")){  
  311.                 return clearAll();  
  312.             }else if(cmd.equals("CE")){  
  313.                 return clear(text);  
  314.             }else if (cmd.equals("Back")) {  
  315.                 return backSpace(text);  
  316.             }else if (numString.indexOf(cmd) != -1) {  
  317.                 return catNum(cmd, text);  
  318.             }else if (opString.indexOf(cmd) != -1) {  
  319.                 return setOp(cmd, text);  
  320.             }else if (cmd.equals("+/-")) {  
  321.                 return setNegative(text);  //设置正负号  
  322.             }else if(cmd.equals("1/x")){  
  323.                 return setReciprocal(text);  
  324.             }else if (cmd.equals("sqrt")) {  
  325.                 return sqrt(text);  
  326.             }else if(cmd.equals("%")){  
  327.                 return cal(text, true);  
  328.             }else if(cmd.equals("=")){  
  329.                 return cal(text, false);  
  330.             }else {  
  331.                 return mCmd(cmd, text);  
  332.             }  
  333.         }  
  334.     }  

回复 "计算器"

这儿你可以回复上面这条便签

captcha