Java 实现简易计算器完整代码
2017-01-02 19:31
543 查看
最近在学习java的编程,就写了个简易的计算器,可以实现基本的运算,测试目前无bug,下面分享下自己的代码。
首先界面:
整个面板用了BorderLayout布局,分为北,左和中。中部采用网格布局。定义这个类位CalFrame.Java:
接着实现几个基本的操作,加,减,乘,除。考虑到精度和范围的问题.我们定义了一个MyMath类,数据格式使用BigDecimal对象,进行计算。MyMath.java:
}
最后处理按钮的事件,我们定义了一个CalService类处理业务逻辑:
最后的calMethod方法大量使用if else判断不是好的实现方法,感兴趣的可以看看java的设计模式,消除这样的判断。
至此,一个简易的计算器就完成了。欢迎大家给为留言,共同学习。
首先界面:
整个面板用了BorderLayout布局,分为北,左和中。中部采用网格布局。定义这个类位CalFrame.Java:
package com.example.java; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class CalFrame extends JFrame { /** * 计算器的外观设计 */ private static final long serialVersionUID = 1L; private static final int PRE_WIDTH = 500; private static final int PRE_HEIGHT = 400; private JTextField text = null; private JButton button = null; //存储标记 private String[] nOp = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="}; private String[] mOp = {"MC","MR","MS","M+"}; private String[] rOp = {"Back","CE","C"}; private CalService service = new CalService(); public CalFrame() { this.setTitle("计算器"); this.setSize(PRE_WIDTH, PRE_HEIGHT); this.setLocationRelativeTo(null); this.setResizable(false); //添加底层 JPanel panel = new JPanel(); panel.setLayout(new BorderLayout(10,1)); panel.add(getTextField(), BorderLayout.NORTH); panel.setPreferredSize(new Dimension(PRE_WIDTH, PRE_HEIGHT)); //west JButton[] mButton = getMButton(); JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayout(5, 1, 0, 5)); for (JButton jButton : mButton) { panel1.add(jButton); } panel.add(panel1, BorderLayout.WEST); JButton[] rButton = getRButton(); JPanel panel2 = new JPanel(); panel2.setLayout(new BorderLayout(1, 5)); JPanel panel21 = new JPanel(); panel21.setLayout(new GridLayout(1, 3, 3, 3)); for (JButton jButton : rButton) { panel21.add(jButton); } panel2.add(panel21,BorderLayout.NORTH); JButton[] nButton = getNButton(); JPanel panel3 = new JPanel(); panel3.setLayout(new GridLayout(4,5,3,5)); for (JButton jButton : nButton) { panel3.add(jButton); } panel2.add(panel3, BorderLayout.CENTER); panel.add(panel2, BorderLayout.CENTER); this.add(panel); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true); } //返回数字键 private JButton[] getNButton() { String[] redButton = {"/","*","-","+","="}; JButton[] nbutton = new JButton[nOp.length]; for (int i = 0; i < nOp.length; i++) { JButton b = new JButton(this.nOp[i]); b.addActionListener(getActionListener()); Arrays.sort(redButton); if (Arrays.binarySearch(redButton, nOp[i]) >= 0) { b.setForeground(Color.red); }else { b.setForeground(Color.blue); } nbutton[i] = b; } return nbutton; } private JButton[] getRButton() { JButton[] rButton = new JButton[rOp.length]; for (int i = 0; i < rOp.length; i++) { JButton b = new JButton(this.rOp[i]); b.addActionListener(getActionListener()); b.setForeground(Color.red); rButton[i] = b; } return rButton; } //返回操作健 private JButton[] getMButton() { JButton[] mbutton = new JButton[mOp.length+1]; mbutton[0] = getButton(); for (int i = 0; i < this.mOp.length; i++) { JButton b = new JButton(this.mOp[i]); b.addActionListener(getActionListener()); b.setForeground(Color.red); mbutton[i+1] = b; } return mbutton; } private ActionListener getActionListener() { ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); String result = null; try { result = service.callMethod(cmd,text.getText()); } catch (Exception e2) { System.out.println(e2.getMessage()); } if (cmd.indexOf("MC")==0) { button.setText(""); }else if (cmd.indexOf("M")==0) { button.setText("M"); } //显示计算结果 if (result != null) { text.setText(result); } } }; return actionListener; } private JButton getButton() { button = new JButton(); return button; } //返回显示框 public JTextField getTextField() { text = new JTextField("0",10); return text; } public static void main(String[] args) { new CalFrame(); } }
接着实现几个基本的操作,加,减,乘,除。考虑到精度和范围的问题.我们定义了一个MyMath类,数据格式使用BigDecimal对象,进行计算。MyMath.java:
package com.example.java; import java.math.BigDecimal; public class MyMath { public static double add(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.add(second).doubleValue(); } public static double divide(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.divide(second, 3, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static double multiply(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.multiply(second).doubleValue(); } public static double subtract(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.subtract(second).doubleValue(); } /** * 为一个double类型创建BigDecimal对象 * @param number * @return */ private static BigDecimal getBigDecimal(double number) { return new BigDecimal(number); }
}
最后处理按钮的事件,我们定义了一个CalService类处理业务逻辑:
package com.example.java; /** * 处理业务逻辑 * @author l * */ public class CalService { private boolean isSecondNum = false; private String lastOp; private String firstNum = "0"; private String secondNum ="null"; private double store; private String numString = "0123456789."; private String opString = "+-*/"; public String callMethod(String cmd, String text) { if (cmd.equals("C")) { return cleanAll(); }else if(cmd.equals("CE")){ return clear(text); }else if (cmd.equals("Back")) { return backSpace(text); }else if (numString.indexOf(cmd) != -1) { return catNum(cmd,text); }else if (opString.indexOf(cmd) != -1) { return setOp(cmd,text); }else if (cmd.equals("+/-")) { return setNegative(text); }else if (cmd.equals("1/x")) { return setReciprocal(text); }else if (cmd.equals("sqrt")) { return sqrt(text); }else if (cmd.equals("%")) { return cal(text,true); }else if (cmd.equals("=")) { return cal(text,false); }else{ return mCmd(cmd,text); } } private String cleanAll() { this.firstNum = "0"; this.secondNum = null; return this.firstNum; } private String clear(String text) { return "0"; } private String backSpace(String text) { return text.equals("0")||text.equals("")? "0" :text.substring(0, text.length()-1); } private String catNum(String cmd, String text) { String result = cmd; // 如果text不等于0 if (!"0".equals(text)) { if (isSecondNum) { isSecondNum = false; }else { result = text + cmd; } } if (result.indexOf(".") == 0) { result = "0" + result; } return result; } private String setOp(String cmd, String text) { this.lastOp = cmd; this.firstNum = text; this.secondNum = null; this.isSecondNum = true; return null; } private String setNegative(String text) { if (text.indexOf("-") == 0) { return text.substring(1, text.length()); }else{ return "-"+text; } } //求倒数 private String setReciprocal(String text) { if (text.equals("0")) { return text; }else{ this.isSecondNum = true; return String.valueOf(MyMath.divide(1,Double.valueOf(text))); } } //求开方 private String sqrt(String text) { this.isSecondNum = true; return String.valueOf(Math.sqrt(Double.valueOf(text))); } private String cal(String text, boolean isPercent) { double secondResult = secondNum == null ? Double.valueOf(text).doubleValue() : Double.valueOf(secondNum).doubleValue(); // 除数为0 if (secondResult == 0 && this.lastOp.equals("/")) { return "0"; } //有% if (isPercent) { secondResult = MyMath.multiply(Double.valueOf(firstNum),MyMath.divide(secondResult,100)); } if (this.lastOp.equals("+")) { firstNum = String.valueOf(MyMath.add(Double.valueOf(firstNum), secondResult)); }else if (this.lastOp.equals("-")) { firstNum = String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult)); }else if (this.lastOp.equals("*")) { firstNum = String.valueOf(MyMath.multiply(Double.valueOf(firstNum), secondResult)); }else if (this.lastOp.equals("/")) { firstNum = String.valueOf(MyMath.divide(Double.valueOf(firstNum), secondResult)); } secondNum = secondNum == null ? text : secondNum; this.isSecondNum = true; return firstNum; } //存储 private String mCmd(String cmd, String text) { if (cmd.equals("M+")) { store = MyMath.add(store, Double.valueOf(text)); }else if (cmd.equals("MC")) { store = 0; }else if (cmd.equals("MR")) { isSecondNum = true; return String.valueOf(store); }else if (cmd.equals("MS")) { store = Double.valueOf(text).doubleValue(); } return null; } }
最后的calMethod方法大量使用if else判断不是好的实现方法,感兴趣的可以看看java的设计模式,消除这样的判断。
至此,一个简易的计算器就完成了。欢迎大家给为留言,共同学习。
相关文章推荐
- java实现简易计算器完整代码
- 实现高效的数据库连接池(附带完整代码C#和Java实现)
- java 生成EXCEL完整实现(附加代码)
- java 实现字符串以及文件的md5、sha计算完整代码
- Java实现生成Excel树形表头完整代码示例
- Rhyme/ java TCP网络编程 聊天室(群聊与私聊)TCP、多线程、IO流编程完整代码实现
- 如何编写出高效的数据库连接池(附带完整代码C#和Java实现)
- 简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码。
- Java中实现FTP上传下载文件的功能,完整代码
- 算法#13--红黑树完整代码Java实现
- 用java代码写的简易计算器(可以实现基本的加减乘除功能)
- java实现客户端一键群发消息完整代码
- 实现高效的数据库连接池(附带完整代码C#和Java实现)(转)
- Java中实现FTP上传下载文件的功能,完整代码
- java代码实现highchart与数据库数据结合完整案例分析(一)---饼状图
- 算法#16--B树完整代码Java实现
- 如何编写出高效的数据库连接池(附带完整代码C#和Java实现)
- 每日20行之4~~~两种方法java实现简易计算器 附带复杂计算器代码(优先级顺序)
- 实现高效的数据库连接池(附带完整代码C#和Java实现)
- java代码实现highchart与数据库数据结合完整案例分析(二)---折线图