初識java:利用swing制作一個簡單的計算器,仿造window10內置計算器標准模式下的界面。
涉及學習內容:
- 設置窗口
- 設計界面按鍵
- 設置文本框:只讀
- String字符串操作:與double類型間的相互轉換
- 設置字體屬性
- 對計算器多種使用情況的考慮,如以加減法為例:
- 正常操作是輸入一個數后按+號再按另一個數字:12+15
- 考慮使用者先按+號,那么應該該顯示:0+,乘除則為1*;
- 考慮使用者按下+號鍵后反悔想使用減號;那么應當在還沒輸入另一個數值前進行更改:12+15+變12+15-,並且不影響結果
- 被除數不能為0。
在設計過程中需要不斷對window10的計算器進行比較(可能有的win10已經沒有內置計算器了),綜合考慮所有可能出現的情況
本計算器不足之處:1、除的計算結果保留15位數
2、定義double類型計算能力有限
3、文本框長度不足,超出范圍無法向win10一樣滑動查看
4、按下等於號后的操作有兩種方式:1、按下運算符,對結果進行下一步的操作
2、全部初始化。本計算器只采用這一種
本源代碼為本人原始設計思路,代碼較長,許多類似代碼可進行優化處理,僅供參考,初學Java,如有不足之處請多多指教。
package calculator; //包名,根據自己創建的項目而定 import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton;//按鍵 import javax.swing.JFrame;//顯示窗口 import javax.swing.JTextField;//文本框 import javax.swing.WindowConstants; public class show extends JFrame { ///主類show繼承父類JFrame private String[] ajm= { "%","√","X^2","1/X", "ce","c","<<<","÷", "7","8","9","*", "4","5","6","-", "1","2","3","+", "+/-","0",".","=" }; private JButton Ajm[]=new JButton[ajm.length];//按鍵數組0-23 public JTextField t1=new JTextField(); public JTextField t2=new JTextField();//創建兩個文本款用於顯示輸入以及計算結果的情況 String str=""; //存儲輸入的值,顯示在下面文本框t2 String str1=""; //存儲所有點擊按鍵的結果顯示於上面的文本框t1 double b=0; //存儲計算結果用於下一步的計算 char ch=0; //存儲運算符號用於下一步的計算 public void kuangjia() { java.awt.Container c=getContentPane(); //容器 this.setTitle("計算器");//標題 this.setVisible(true);//表示可顯示 setLayout(null); setBounds(1000, 100,620, 900);//彈出寬高的大小,彈出的位置,左上角為00 for(int i=0;i<ajm.length;i++) Ajm[i]=new JButton(ajm[i]); //建立按鍵 int begin=0; int bend=250; for(int i=0;i<ajm.length;)//設計按鍵位置即界面顯示效果 { int j=0; while(j<4)///搞定一行換一行 { Ajm[i].setBounds(begin, bend, 150, 100);//按鍵的大小 Ajm[i].setFont(new java.awt.Font("宋體", Font.BOLD, 45));//按鍵顯示的字體屬性 c.add(Ajm[i]);//加入容器 i++;j++; begin+=150;//根據窗口大小調整按鍵的位置 } begin=0;bend+=100; }; for(int i=8;i<19;i++)///設置數字按鍵的顏色為白 { if(i==11||i==15) i++; Ajm[i].setBackground(Color.white); } Ajm[21].setBackground(Color.white);//由於0號鍵位置特殊,所以單獨設置 ////////////上下兩個文本框的屬性設置 setLayout(null); t1.setFont(new java.awt.Font("宋體", Font.BOLD, 40)); this.add(t1); t1.setBounds(0,0,600,100); t1.setEnabled(false); //只讀 t1.setText("chengjunfeng");//顯示內容 this.setLayout(null); this.add(t2); t2.setBounds(0,99,600,155); t2.setFont(new java.awt.Font("宋體", Font.BOLD, 60)); t2.setEnabled(false); //只讀 t2.setText("First calculator"); ///建立監視器,表示當你按下這個按鍵將會執行什么 Ajm[0].addActionListener(new ajm0());//當0號鍵被按下,這個按鍵對應的就是%,將會執行ajm0這個類 Ajm[1].addActionListener(new ajm1()); Ajm[2].addActionListener(new ajm2()); Ajm[3].addActionListener(new ajm3()); Ajm[4].addActionListener(new ajm4()); Ajm[5].addActionListener(new ajm5()); Ajm[6].addActionListener(new ajm6()); Ajm[7].addActionListener(new ajm7()); Ajm[8].addActionListener(new ajm8()); Ajm[9].addActionListener(new ajm9()); Ajm[10].addActionListener(new ajm10()); Ajm[11].addActionListener(new ajm11()); Ajm[12].addActionListener(new ajm12()); Ajm[13].addActionListener(new ajm13()); Ajm[14].addActionListener(new ajm14()); Ajm[15].addActionListener(new ajm15()); Ajm[16].addActionListener(new ajm16()); Ajm[17].addActionListener(new ajm17()); Ajm[18].addActionListener(new ajm18()); Ajm[19].addActionListener(new ajm19()); Ajm[20].addActionListener(new ajm20()); Ajm[21].addActionListener(new ajm21()); Ajm[22].addActionListener(new ajm22()); Ajm[23].addActionListener(new ajm23()); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//關閉方式 } ////這是一個有點特殊的類於加減乘除類相關,可先跳過這個類,看下面的類 class panduan{ public void pd(char a) { if(a==0)//表示沒有按運算鍵 if(str.length()==0) b=0;//而且沒有輸入值,如直接按等於號, else b=Double.parseDouble(str);//有輸入值按等於號 else //考慮ch=加減乘除的四種情況,b作為計算結果顯示在下面的文本框 switch ( a) { case 43: b += Double.parseDouble(str); t2.setText(String.valueOf(b)); break; case 45: b -= Double.parseDouble(str); t2.setText(String.valueOf(b)); break; case 42: b *= Double.parseDouble(str); t2.setText(String.valueOf(b)); break; case 47: double aa; aa= Double.parseDouble(str); if(aa==0) { t2.setText("除數不能為0"); str1=""; str=""; b=0; break; } b=(b/aa); t2.setText(String.valueOf(b)); break; } } } //////% class ajm0 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(str1.length()==0) { t1.setText("0"); t2.setText("0"); str=""; return; }//當什么都沒有輸入直接按的情況 else if(str.length()==0) { t1.setText(str1); double t=b*b/100; str=String.valueOf(t); t1.setText(str1); t2.setText(str); }//有一定的輸入后,即按了運算符號后還沒輸入值的情況,即對b進行操作 //12+12+這時候按下后應當是對24進行操作 else { double dd=Double.parseDouble(str); dd=b*dd/100; str=String.valueOf(dd); t1.setText(str1); t2.setText(str); }///否則則是對正使用下對輸入值的轉變24 變0.24 } } //√取開方 4√=2 class ajm1 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(str.length()==0) { t1.setText(str1); double t=Math.sqrt(b); str=String.valueOf(t); t1.setText(str1); t2.setText(str); } else { double dd=Double.parseDouble(str); dd=Math.sqrt(dd);; str= String.valueOf(dd); t1.setText(str1); t2.setText(str); } } } ///取平方 class ajm2 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(str.length()==0) { t1.setText(str1); double t=b*b; str=String.valueOf(t); t1.setText(str1); t2.setText(str); } else { double dd=Double.parseDouble(str); dd*=dd; str= String.valueOf(dd); t1.setText(str1); t2.setText(str); } } } //1/x class ajm3 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(str.length()==0) { t1.setText(str1); double t=1/b; str=String.valueOf(t); t1.setText(str1); t2.setText(str); } else { double dd=Double.parseDouble(str); dd=1/dd; str= String.valueOf(dd); t1.setText(str1); t2.setText(str); } } } ///ce str清空 ,t2沒顯示 class ajm4 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str=""; t2.setText(str); } } //把全部清空,即全部為初始狀態 class ajm5 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str=""; t2.setText(str); str1=""; t1.setText(str1); b=0; ch=0; } } ///退格鍵,對剛輸入的數字進行一個個刪除操作,點一次刪除一個 class ajm6 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(str.length()==0) t2.setText("");//空的話刪了也是空,所以顯示空就對了 else { char ss[]=str.toCharArray();//將str轉化為數組進行操作 ss[str.length()-1]= 32; //32在acsii碼中表示為空格,將要刪除的數字變成空格 str= String.valueOf(ss);//重新將數組變成字符串 str=str.trim();//刪除空格,這樣最后面那個數就沒有了str長度減一 t2.setText(str);//再顯示出來比之前就少了一個, //java應該有直接刪除的方法只不過我不會,所以我的思路有點曲折 }//不為空,剛輸入的數字還沒刪完 } } ///÷號,剛才跳過的第一個類在這里就有用了 class ajm7 extends panduan implements ActionListener{//繼承pandaun為父類,就可以調用他的方法pd public void actionPerformed(ActionEvent arg0) { int r; r=str1.length(); if(r>0&&str.length()==0)//str1不為空,str為空,1;你剛輸入的是數字12+15 2:你剛輸入的是運算符12+15+ { char a[]=str1.toCharArray(); if(a[r-1]<48||a[r-1]>57)//又是acsii碼;判斷最后一個是不是運算符 { a[str1.length()-1]=47; str1=String.valueOf(a); t1.setText(str1); ch=47;//是的話就把他變成除號/ return; } } if(str.length()==0)//下空 {str1=new String("0"); t2.setText("0"); }//初始狀態按÷, str1+=str+new String("÷"); //把str和運算符號加在str1后面,顯示在t1, t1.setText(str1); this.pd(ch);//執行上一個運算符; //也就是說在12+15后你按下÷,那么就執行上一個ch表示的運算符+后,b就變成27,下一個運算符變成/,再輸入下一個值,下一次按運算符或=時,就執行27/你下一個輸入的值 ch=47; t1.setText(str1); str="";//這時str沒用了,就置空方便下次輸入 } } //輸入7,存在str字符串后面 class ajm8 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=7; t2.setText(str); } } class ajm9 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=8; t2.setText(str); } } class ajm10 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=9; t2.setText(str); } } ///*與÷類似 class ajm11 extends panduan implements ActionListener{ public void actionPerformed(ActionEvent arg0) { int r; r=str1.length(); if(r>0&&str.length()==0) { char a[]=str1.toCharArray(); if(a[r-1]<48||a[r-1]>57) { a[str1.length()-1]=42; str1=String.valueOf(a); t1.setText(str1); ch=42; return; } }// if(str.length()==0)//下空 {str1=new String("1"); t2.setText("0"); b=1; }//初始狀態按*, str1+=str+new String("*"); t1.setText(str1); this.pd(ch);//執行上一個運算符; ch=42; t1.setText(str1); str=""; } } class ajm12 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=4; t2.setText(str); } } class ajm13 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=5; t2.setText(str); } } class ajm14 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=6; t2.setText(str); } } //減號與÷類似 class ajm15 extends panduan implements ActionListener{ public void actionPerformed(ActionEvent arg0) { int r; r=str1.length(); if(r>0&&str.length()==0) { char a[]=str1.toCharArray(); if(a[r-1]<48||a[r-1]>57) { a[str1.length()-1]=45; str1=String.valueOf(a); t1.setText(str1); ch=45; return; } }// if(str.length()==0)//下空 {str1=new String("0"); t2.setText("0"); }//初始狀態按-, str1+=str+new String("-"); t1.setText(str1); this.pd(ch);//執行上一個運算符; ch=45; t1.setText(str1); str=""; } } class ajm16 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=1; t2.setText(str); } } class ajm17 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=2; t2.setText(str); } } class ajm18 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=3; t2.setText(str); } } ///加號與前面類似 class ajm19 extends panduan implements ActionListener{ public void actionPerformed(ActionEvent arg0) { int r; r=str1.length(); if(r>0&&str.length()==0) { char a[]=str1.toCharArray(); if(a[r-1]<48||a[r-1]>57) { a[str1.length()-1]=43; str1=String.valueOf(a); t1.setText(str1); ch=43; return; } }/////對連續出現兩個運算符號進行操作 if(str.length()==0)//下空 {str1=new String("0"); t2.setText("0"); }//初始狀態按+, str1+=str+new String("+"); t1.setText(str1); this.pd(ch);//執行上一個運算符; ch=43; t1.setText(str1); str=""; } } ///正負轉換,類似前面% class ajm20 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(str.length()==0) { t1.setText(str1); double t=-b; str=String.valueOf(t); t1.setText(str1); t2.setText(str); } else { double dd=Double.parseDouble(str); str= String.valueOf(-dd); t1.setText(str1); t2.setText(str); } } } class ajm21 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+=0; t2.setText(str); } } class ajm22 implements ActionListener{ public void actionPerformed(ActionEvent arg0) { str+="."; t2.setText(str); } } //等號的操作 class ajm23 extends panduan implements ActionListener{ public void actionPerformed(ActionEvent arg0) { int r; r=str1.length(); if(r>0&&str.length()==0)//類似前面;但是這里不是對ch進行重新賦值,而是直接輸出b { char a[]=str1.toCharArray(); if(a[r-1]<48||a[r-1]>57) { t1.setText("0"); t2.setText(String.valueOf(b)); return; } } this.pd(ch); t1.setText("0"); str1=""; str=""; ch=0; }//等於號之后全部歸0,返回初始狀態 } public static void main(String[] args) {//主函數 show s=new show(); s.kuangjia();//直接定義主類的對象,調用方法就自動執行了 } }