日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java實(shí)現(xiàn)簡易計(jì)算器完整代碼

 正心行 2016-06-22

早晨起來沒事,打開mac突然想寫個(gè)小程序,就寫來個(gè)簡易的計(jì)算器,可以實(shí)現(xiàn)基本的運(yùn)算,測(cè)試目前無bug,下面分享下自己的代碼。

首先寫了個(gè)簡單的界面如下:



整個(gè)面板用了BorderLayout布局,分為北,左和中。中部采用網(wǎng)格布局。定義這個(gè)類為CalFrame.java:

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 { /** * 計(jì)算器的外觀設(shè)計(jì) */ 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; //存儲(chǔ)標(biāo)記 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('計(jì)算器'); 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; } //返回?cái)?shù)字鍵 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');="" }="" 顯示計(jì)算結(jié)果="" if(result="" !="null){" text.settext(result);="" }="" }="" };="" return="" actionlistener;="" }="" public="" static="" void="" main(string[]="" args)="" {="" new="" calframe();="">

接著實(shí)現(xiàn)幾個(gè)基本的操作,加,減,乘,除??紤]到精度和范圍的問題,我們定義了一個(gè)MyMath類,數(shù)據(jù)格式都使用BigDecimal對(duì)象進(jìn)行計(jì)算。MyMath.java:

package calframe;import java.math.BigDecimal;public class MyMath { /** * 為一個(gè)double類型創(chuàng)建BigDecimal對(duì)象 */ 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(); }}

最后處理按鈕的事件,我們定義了一個(gè)CalService類處理業(yè)務(wù)邏輯:

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(); //除數(shù)為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))); } //求倒數(shù) public String setReciprocal(String text){ if (text.equals('0')){ return text; }else{ this.isSecondNum = true; return String.valueOf(MyMath.divide(1, Double.valueOf(text))); } } //存儲(chǔ) 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); //設(shè)置正負(fù)號(hào) }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); } }}
最后的calMethod方法大量使用if else判斷不是好的實(shí)現(xiàn)方法,感興趣的可以看看java的設(shè)計(jì)模式,消除這樣的判斷。
至此,一個(gè)簡易的計(jì)算器就完成了。歡迎大家給為留言,共同學(xué)習(xí),共同進(jìn)步。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多