扣丁學(xué)堂Java培訓(xùn)之實(shí)現(xiàn)簡易計算器完整代碼
2018-01-23 11:14:10
1406瀏覽
今天扣丁學(xué)堂給介紹一下關(guān)于一款用Java語言寫的簡易計算器,希望對最近學(xué)習(xí)java的編程同學(xué)有所幫助,它可以實(shí)現(xiàn)基本的運(yùn)算,測試目前無bug,下面我們一起來看下吧。
首先界面:
整個面板用了BorderLayout布局,分為北,左和中。中部采用網(wǎng)格布局。定義這個類位CalFrame.Java:
packagecom.example.java;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.Arrays;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
publicclassCalFrameextendsJFrame{
/**
*計算器的外觀設(shè)計
*/
privatestaticfinallongserialVersionUID=1L;
privatestaticfinalintPRE_WIDTH=500;
privatestaticfinalintPRE_HEIGHT=400;
privateJTextFieldtext=null;
privateJButtonbutton=null;//存儲標(biāo)記
privateString[]nOp={"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};
privateString[]mOp={"MC","MR","MS","M+"};
privateString[]rOp={"Back","CE","C"};
privateCalServiceservice=newCalService();
publicCalFrame(){
this.setTitle("計算器");
this.setSize(PRE_WIDTH,PRE_HEIGHT);
this.setLocationRelativeTo(null);
this.setResizable(false);
//添加底層
JPanelpanel=newJPanel();
panel.setLayout(newBorderLayout(10,1));
panel.add(getTextField(),BorderLayout.NORTH);
panel.setPreferredSize(newDimension(PRE_WIDTH,PRE_HEIGHT));
//west
JButton[]mButton=getMButton();
JPanelpanel1=newJPanel();
panel1.setLayout(newGridLayout(5,1,0,5));
for(JButtonjButton:mButton){
panel1.add(jButton);
}
panel.add(panel1,BorderLayout.WEST);
JButton[]rButton=getRButton();
JPanelpanel2=newJPanel();
panel2.setLayout(newBorderLayout(1,5));
JPanelpanel21=newJPanel();
panel21.setLayout(newGridLayout(1,3,3,3));
for(JButtonjButton:rButton){
panel21.add(jButton);
}
panel2.add(panel21,BorderLayout.NORTH);
JButton[]nButton=getNButton();
JPanelpanel3=newJPanel();
panel3.setLayout(newGridLayout(4,5,3,5));
for(JButtonjButton: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);
}
//返回數(shù)字鍵
privateJButton[]getNButton(){
String[]redButton={"/","*","-","+","="};
JButton[]nbutton=newJButton[nOp.length];
for(inti=0;i<nOp.length;i++){
JButtonb=newJButton(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;
}
returnnbutton;
}
privateJButton[]getRButton(){
JButton[]rButton=newJButton[rOp.length];
for(inti=0;i<rOp.length;i++){
JButtonb=newJButton(this.rOp[i]);
b.addActionListener(getActionListener());
b.setForeground(Color.red);
rButton[i]=b;
}
returnrButton;
}
//返回操作健
privateJButton[]getMButton(){
JButton[]mbutton=newJButton[mOp.length+1];
mbutton[0]=getButton();
for(inti=0;i<this.mOp.length;i++){
JButtonb=newJButton(this.mOp[i]);
b.addActionListener(getActionListener());
b.setForeground(Color.red);
mbutton[i+1]=b;
}
returnmbutton;
}
privateActionListenergetActionListener(){
ActionListeneractionListener=newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
Stringcmd=e.getActionCommand();
Stringresult=null;
try{
result=service.callMethod(cmd,text.getText());
}catch(Exceptione2){
System.out.println(e2.getMessage());
}
if(cmd.indexOf("MC")==0){
button.setText("");
}elseif(cmd.indexOf("M")==0){
button.setText("M");
}
//顯示計算結(jié)果
if(result!=null){
text.setText(result);
}
}
};
returnactionListener;
}
privateJButtongetButton(){
button=newJButton();
returnbutton;
}
//返回顯示框
publicJTextFieldgetTextField(){
text=newJTextField("0",10);
returntext;
}
publicstaticvoidmain(String[]args){
newCalFrame();
}
}
接著實(shí)現(xiàn)幾個基本的操作,加,減,乘,除??紤]到精度和范圍的問題.我們定義了一個MyMath類,數(shù)據(jù)格式使用BigDecimal對象,進(jìn)行計算。MyMath.java:
packagecom.example.java;
importjava.math.BigDecimal;
publicclassMyMath{
publicstaticdoubleadd(doublenum1,doublenum2){
BigDecimalfirst=getBigDecimal(num1);
BigDecimalsecond=getBigDecimal(num2);
returnfirst.add(second).doubleValue();
}
publicstaticdoubledivide(doublenum1,doublenum2){
BigDecimalfirst=getBigDecimal(num1);
BigDecimalsecond=getBigDecimal(num2);
returnfirst.divide(second,3,BigDecimal.ROUND_HALF_UP).doubleValue();
}
publicstaticdoublemultiply(doublenum1,doublenum2){
BigDecimalfirst=getBigDecimal(num1);
BigDecimalsecond=getBigDecimal(num2);
returnfirst.multiply(second).doubleValue();
}
publicstaticdoublesubtract(doublenum1,doublenum2){
BigDecimalfirst=getBigDecimal(num1);
BigDecimalsecond=getBigDecimal(num2);
returnfirst.subtract(second).doubleValue();
}
/**
*為一個double類型創(chuàng)建BigDecimal對象
*@paramnumber
*@return
*/
privatestaticBigDecimalgetBigDecimal(doublenumber){
returnnewBigDecimal(number);
}
123456789101112131415161718192021222324252627282930313233343536373839
}
最后處理按鈕的事件,我們定義了一個CalService類處理業(yè)務(wù)邏輯:
packagecom.example.java;
/**
*處理業(yè)務(wù)邏輯
*@authorl
*
*/
publicclassCalService{
privatebooleanisSecondNum=false;
privateStringlastOp;
privateStringfirstNum="0";
privateStringsecondNum="null";
privatedoublestore;
privateStringnumString="0123456789.";
privateStringopString="+-*/";
publicStringcallMethod(Stringcmd,Stringtext){
if(cmd.equals("C")){
returncleanAll();
}elseif(cmd.equals("CE")){
returnclear(text);
}elseif(cmd.equals("Back")){
returnbackSpace(text);
}elseif(numString.indexOf(cmd)!=-1){
returncatNum(cmd,text);
}elseif(opString.indexOf(cmd)!=-1){
returnsetOp(cmd,text);
}elseif(cmd.equals("+/-")){
returnsetNegative(text);
}elseif(cmd.equals("1/x")){
returnsetReciprocal(text);
}elseif(cmd.equals("sqrt")){
returnsqrt(text);
}elseif(cmd.equals("%")){
returncal(text,true);
}elseif(cmd.equals("=")){
returncal(text,false);
}else{
returnmCmd(cmd,text);
}
}
privateStringcleanAll(){
this.firstNum="0";
this.secondNum=null;
returnthis.firstNum;
}
privateStringclear(Stringtext){
return"0";
}
privateStringbackSpace(Stringtext){
returntext.equals("0")||text.equals("")?"0":text.substring(0,text.length()-1);
}
privateStringcatNum(Stringcmd,Stringtext){
Stringresult=cmd;
//如果text不等于0
if(!"0".equals(text)){
if(isSecondNum){
isSecondNum=false;
}else{
result=text+cmd;
}
}
if(result.indexOf(".")==0){
result="0"+result;
}
returnresult;
}
privateStringsetOp(Stringcmd,Stringtext){
this.lastOp=cmd;
this.firstNum=text;
this.secondNum=null;
this.isSecondNum=true;
returnnull;
}
privateStringsetNegative(Stringtext){
if(text.indexOf("-")==0){
returntext.substring(1,text.length());
}else{
return"-"+text;
}
}
//求倒數(shù)
privateStringsetReciprocal(Stringtext){
if(text.equals("0")){
returntext;
}else{
this.isSecondNum=true;
returnString.valueOf(MyMath.divide(1,Double.valueOf(text)));
}
}
//求開方
privateStringsqrt(Stringtext){
this.isSecondNum=true;
returnString.valueOf(Math.sqrt(Double.valueOf(text)));
}
privateStringcal(Stringtext,booleanisPercent){
doublesecondResult=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));
}elseif(this.lastOp.equals("-")){
firstNum=String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult));
}elseif(this.lastOp.equals("*")){
firstNum=String.valueOf(MyMath.multiply(Double.valueOf(firstNum),secondResult));
}elseif(this.lastOp.equals("/")){
firstNum=String.valueOf(MyMath.divide(Double.valueOf(firstNum),secondResult));
}
secondNum=secondNum==null?text:secondNum;
this.isSecondNum=true;
returnfirstNum;
}
//存儲
privateStringmCmd(Stringcmd,Stringtext){
if(cmd.equals("M+")){
store=MyMath.add(store,Double.valueOf(text));
}elseif(cmd.equals("MC")){
store=0;
}elseif(cmd.equals("MR")){
isSecondNum=true;
returnString.valueOf(store);
}elseif(cmd.equals("MS")){
store=Double.valueOf(text).doubleValue();
}
returnnull;
}
}
最后的calMethod方法大量使用ifelse判斷不是好的實(shí)現(xiàn)方法,感興趣的可以看看java的設(shè)計模式,消除這樣的判斷。最后想要了解更多關(guān)于Java發(fā)展前景趨勢,請關(guān)注扣丁學(xué)堂Java培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺為您提供權(quán)威的Java視頻教程系統(tǒng),通過千鋒扣丁學(xué)堂金牌講師在線錄制的Java在線視頻課程,讓你快速掌握J(rèn)ava從入門到精通開發(fā)實(shí)戰(zhàn)技能。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>
標(biāo)簽:
JavaEE視頻教程
JavaEE培訓(xùn)
JavaEE開發(fā)工程師
Java培訓(xùn)