package calframe; 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 final static int PRE_WIDTH = 500; private final static 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 b : mButton ){ panel1.add(b); } 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 b : rButton){ panel21.add(b); } panel2.add(panel21,BorderLayout.NORTH); JButton[] nButton = getNButton(); JPanel panel22 = new JPanel(); panel22.setLayout(new GridLayout(4,5,3,5)); for(JButton b : nButton){ panel22.add(b); } panel2.add(panel22,BorderLayout.CENTER); panel.add(panel2,BorderLayout.CENTER); this.add(panel); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true); } //返回显示框 private JTextField getTextField(){ text = new JTextField("0",10); //text.setSize(480, 50); return text; } //返回数字键 private JButton[] getNButton(){ String[] redButton = {"/","*","-","+","="}; JButton[] nbutton = new JButton[nOp.length]; for(int i = 0; i < this.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[] 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 JButton[] getRButton(){ JButton[] rbutton = new JButton[rOp.length]; for(int i = 0; i < this.rOp.length; i++){ JButton b = new JButton(this.rOp[i]); b.addActionListener(getActionListener()); b.setForeground(Color.red); rbutton[i] = b; } return rbutton; } private JButton getButton(){ button = new JButton(); return button; } 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; } public static void main(String[] args) { new CalFrame(); } } package calframe; import java.math.BigDecimal; public class MyMath { /** * 为一个double类型创建BigDecimal对象 */ private static BigDecimal getBigDecimal(double number){ return new BigDecimal(number); } public static double add(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.add(second).doubleValue(); } public static double subtract(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.subtract(second).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 divide(double num1, double num2) { BigDecimal first = getBigDecimal(num1); BigDecimal second = getBigDecimal(num2); return first.divide(second,3,BigDecimal.ROUND_HALF_UP).doubleValue(); } } 最后处理按钮的事件,我们定义了一个CalService类处理业务逻辑: [java] view plain copy package calframe; 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 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; } public String setOp(String cmd, String text) { this.lastOp = cmd; this.firstNum = text; this.secondNum = null; this.isSecondNum = true; return null; } public 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; } //求开方 public String sqrt(String text){ this.isSecondNum = true; return String.valueOf(Math.sqrt(Double.valueOf(text))); } //求倒数 public String setReciprocal(String text){ if (text.equals("0")){ return text; }else{ this.isSecondNum = true; return String.valueOf(MyMath.divide(1, Double.valueOf(text))); } } //存储 public 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; } public String backSpace(String text){ return text.equals("0") || text.equals("") ? "0" :text.substring(0,text.length()-1); } public String setNegative(String text){ if(text.indexOf("-") == 0){ return text.substring(1,text.length()); }else{ return "-" + text; } } public String clearAll(){ this.firstNum = "0"; this.secondNum = null; return this.firstNum; } public String clear(String text){ return "0"; } public String callMethod(String cmd, String text){ if(cmd.equals("C")){ return clearAll(); }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); } } }