版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java計算器實驗報告計算機032
胡勇健
03095218
2005年5月5日1.設計名稱與要求2.各模塊功能的介紹和實現(xiàn)3.系統(tǒng)的特色和不足4.參考書實驗名稱及其要求:A)名稱:java計算器的設計B)要求:1.實驗目的:圖形界面設計。熟悉java.awt包中的組件,掌握圖形界面設計方法,理解委托事件處理模型。2.題意:請設計并實現(xiàn)Windows系統(tǒng)中“計算器”的窗口及功能。3.實驗要求:(1)設計圖形界面添加菜單:窗口上添加各種組件及菜單,并處理組件及菜單的事件監(jiān)聽程序。(2)運算:實現(xiàn)多種運算,保證運算正確性。二. 各模塊功能的介紹和實現(xiàn):A)GUI圖形界面的組件:a)所用到的Java類庫包:java.awt.*;java.awt.event.*;javax.swing.*;java.awt.datatransfer.*;基本的圖形界面組件來源于awt包。事件的屬性處理來源于awt.event包。swing組件增加了awt包中所不具備的各種優(yōu)越功能。用于計算器與外部的程序進行復制粘貼。b)所用的各部分圖形組件的定義:FramemainFrame;//主框架JTextFieldanswerText;//顯示計算結果JTextFieldmemoryState;//顯示計算器內存的使用情況MenuBarmenuGroup;//菜單欄MenueditMenu,viewMenu,helpMenu;//編輯,查看,幫助菜單MenuItemcopyItem,pasteItem;//復制,粘貼MenuItemstandardModel;//標準型CheckboxMenuItemnumGroup;//數(shù)字分組MenuItemaboutCal;//關于計算器ButtonbuttonBackSpace,buttonCE,buttonC;//退格,清除,清空按鈕Button buttonMC,buttonMR,buttonMS,buttonMADD;//內存操作按鈕ButtonbuttonNum[];//數(shù)字按鈕ButtonbuttonAdd,buttonSub,buttonMul,buttonDiv;//+,-,*,/ButtonbuttonDot,buttonSign,buttonEqual;//.+/-=ButtonbuttonSqrt,buttonMod,buttonReciprocal;//sqrt%1/xc)組件的初始化以及對界面的排版對主框架的初始化操作voidinitMainFrame()函數(shù)是對主框架進行初始化,設置其框架大小270*250,初始位置270*250,背景顏色Color.lightGray,是否顯示true,能否改變窗口大小false,以及增加了addWindowListener委托事件,當關閉窗口時調用System.exit(O)系統(tǒng)指令,結束程序。voidinitMainFrame(){mainFrame=newFrame("計算器");mainFrame.setSize(270,250);mainFrame.setLocation(200,140);mainFrame.setBackground(Color.lightGray);mainFrame.setResizable(false);mainFrame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}對文本框的初始化操作initTextField()是對文本textBufferanswerTextmemoryState的初始化,textBuffer是用于對文本的緩沖處理,StringBuffer類優(yōu)于String類是因為StringBuffer是對字符串直接操作,從而節(jié)省了內存。由于在這個計算器程序中,對字符串的操作量很大因此,StringBuffer在這方面體現(xiàn)出了其本身的優(yōu)勢。answerText和memoryState用swing的組件JTextField是因為JTextField顯示文本框時可以在文本框的右邊顯示,符合Windows自帶計算器的特點。answerText和memoryState的背景色為白色,都不能進行編輯。answerText為右對齊,大小為23個字符,而memoryState為2個字符。voidinitTextField(){textBuffer=newStringBuffer("");answerText=newJTextField(textBuffe.rtoString(),23);answerText.setHorizontalAlignment(JTextField.RIGHT);answerText.setEditable(false);answerText.setBackground(Color.white);memoryState=newJTextField(2);memoryState.setEditable(false);memoryState.setBackground(Color.white);}對各按鈕的初始化操作initButtons()函數(shù)是對各按鈕進行初始化,為每一個按鈕增加其標簽并增加了addActionListener(this)功能,用于給各按鈕增加屬性,具體的功能代碼,請見actionPerformed(ActionEvente);其中,數(shù)字按鈕、四則運算按鈕、小數(shù)點按鈕都增加了鍵盤輸入功能addKeyListener其參數(shù)為匿名類KeyListener的適配器newKeyAdapter(),當在鍵盤上按下相應的鍵時,為其增加相應的屬性功能。voidinitButtons(){buttonBackSpace=newButton("BackSpace");buttonBackSpace.addActionListener(this);buttonCE=newButton("CE");buttonCE.addActionListener(this);buttonC=newButton("C");buttonC.addActionListener(this);buttonMC=newButton("MC");buttonMC.addActionListener(this);buttonMR=newButton("MR");buttonMR.addActionListener(this);buttonMS=newButton("MS");buttonMS.addActionListener(this);buttonMADD=newButton("M+");buttonMADD.addActionListener(this);buttonNum=newButton[10];for(inti=0;i<buttonNum.length;i++){buttonNum[i]=newButton(Integer.toString(i));buttonNum[i].addActionListener(this);buttonNum[i].addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){
if(Character.isDigit(e.getKeyChar())){textBuffer.append(e.getKeyChar());answerText.setText(textBuffe.rtoString());AddNum();});}buttonAdd=newButton("+");buttonAdd.addActionListener(this);buttonAdd.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='+')AddFunction(1);}});buttonSub=newButton("-");buttonSub.addActionListener(this);buttonSub.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='-')AddFunction(2);}});buttonMul=newButton("*");buttonMul.addActionListener(this);buttonMul.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='*')
AddFunction(3);}});buttonDiv=newButton("/");buttonDiv.addActionListener(this);buttonDiv.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='/')AddFunction(4);}});buttonDot=newButton(".");buttonDot.addActionListener(this);buttonDot.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='.'){textBuffer.append(e.getKeyChar());answerText.setText(textBuffe.rtoString());AddNum();}});buttonSign=newButton("+/-");buttonSign.addActionListener(this);buttonEqual=newButton("=");buttonEqual.addActionListener(this);buttonEqual.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='=')OnGo();}});buttonSqrt=newButton("sqrt");buttonSqrt.addActionListener(this);buttonMod=newButton("%");buttonMod.addActionListener(this);buttonReciprocal=newButton("1/x");buttonReciprocal.addActionListener(this);}對菜單的初始化操作initMenu()函數(shù)是對各菜單的初始化,先為其生成實例對象,再添加到MenuBar的實例對象menuGroup中,Menultem各項添加到相應的Menu中。voidinitMenu(){/*先為各個菜單項生成實例對象,并為其設置相應的標簽。MenuItem各項還要設置addActionListener(this)增加委托事件任務。*/menuGroup=newMenuBar();editMenu=newMenu(‘編輯(E)");viewMenu=newMenu("查看(V)");helpMenu=newMenu("幫助(H)");copyitem=newMenultem("復制(C)Ctrl+C",newMenuShortcut(KeyEvent.VK_C));copyItem.addActionListener(this);pasteitem=newMenultem(‘粘貼(P)Ctrl+V",newMenuShortcut(KeyEvent.VK_V));pasteitem.addActionListener(this);standardModel=newMenultem("?標準型(T)");standardModel.addActionListener(this);numGroup=newCheckboxMenultem("數(shù)字分組(I)",false);numGroup.additemListener(this);aboutCal=newMenuItem("關于計算器(A)");aboutCal.addActionListener(this);/*再把各個菜單相繼加入到MenuBar中*/menuGroup.add(editMenu);menuGroup.add(viewMenu);menuGroup.add(helpMenu);editMenu.add(copyItem);editMenu.add(pasteItem);viewMenu.add(standardModel);viewMenu.add(numGroup);helpMenu.add(aboutCal);}對總框架的總體布局OverallArrangement()是根據(jù)mainFrame的框架大小,把文本框answerText,內存使用的情況文本框memorystate,內存操作鍵MRMSM+MC,退格鍵Backspace清除鍵CE,清空鍵C,以及主鍵盤區(qū)的各鍵按照一定的比例位置加入到mainFrame中.voidOverallArrangement()//文本框的容器//文本框的容器//計算器上部分的容器//計算器中部的容器//主鍵盤區(qū)的容器//內存區(qū)的容器//數(shù)字及相應的操作鍵盤區(qū)PaneltextPanel=newPanel();PanelupperPanel=newPanel();PanelcenterPanel=newPanel();PanelmainPanel=newPanel();PanelleftPanel=newPanel();PanelrightPanel=newPanel();
mainFrame.setMenuBar(menuGroup);//為主框架設置菜單欄mainFrame.add(upperPanel,BorderLayout.NORTH);//把上容器放在主框架的北面mainFrame.add(centerPanel);//把中容器放在主框架的中部mainFrame.add(mainPanel,BorderLayout.SOUTH);//把主容器放在主框架的南面/*設置主框架的上半部分*/textPanel.add(answerText); //把文本框添加到文本容器中upperPanel.add(textPanel); //把文本容器放入上容器中/*設置主框架的中部*///采用流式布局,各組件相互間隔10個像素//把內存記憶框放在中容器中//把內存記憶框放在中容器中//把退格鍵放在中容器中//把清除鍵放在中容器中//把清空鍵放在中容器中centerPanel.add(memoryState);centerPanel.add(buttonBackSpace);centerPanel.add(buttonCE);centerPanel.add(buttonC);/*設置主框架的下半部分*/leftPanel.setLayout(newGridLayout(4,1,0,2));//左下角的容器采用4*1的網(wǎng)式布局
leftPanel.add(buttonMC); //添加MCleftPanel.add(buttonMR); //添加MRleftPanel.add(buttonMS); //添加MSleftPanel.add(buttonMADD); //添加M+mainPanel.add(leftPanel,BorderLayout.WEST);//把此容器放在主容器的西面/*設置主鍵盤區(qū)*/rightPanel.setLayout(newGridLayout(4,5,3,3));//采用4*5的網(wǎng)式布局,相互間隔3各像素/*添加各鍵*/rightPanel.add(buttonNum[7]);rightPanel.add(buttonNum[8]);rightPanel.add(buttonNum[9]);rightPanel.add(buttonDiv);rightPanel.add(buttonSqrt);rightPanel.add(buttonNum[4]);rightPanel.add(buttonNum[5]);rightPanel.add(buttonNum[6]);rightPanel.add(buttonMul);rightPanel.add(buttonMod);rightPanel.add(buttonNum[1]);rightPanel.add(buttonNum[2]);rightPanel.add(buttonNum[3]);rightPanel.add(buttonSub);rightPanel.add(buttonReciprocal);rightPanel.add(buttonNum[0]);rightPanel.add(buttonSign);rightPanel.add(buttonDot);rightPanel.add(buttonAdd);rightPanel.add(buttonEqual);mainPanel.add(rightPanel,BorderLayout.CENTER);}計算器構造函數(shù)是對各布局函數(shù)的調用SimpleCalculator(){initMainFrame();initTextField();initButtons();initMenu();OverallArrangement();reSet();mainFrame.setVisible(true);}B)計算運算部分程序的執(zhí)行過程:a)運算部分變量的定義stringBuffertextBuffer;intnumDot;intoperator;//記錄數(shù)值的字符串//小數(shù)點的個數(shù)//操作符:1-加法2-減法3-乘法4-除法doublefirstValue,secondValue,result;//第一、二個數(shù)及結果booleanenterSecond;intforFirOrSec;//是否已經輸入了第二個數(shù)//此時輸入的是第一個還是第二個數(shù)booleanb_remFir,b_remSec,b_remFun;//指示是否此時還記的上次的數(shù)和運算符intremFun;doubleremFir,remSec;//記住上次的運算符//記住上次參加運算的第一二個數(shù)
booleanisNumGroup=false;booleancanBeBack;booleanisNumGroup=false;booleancanBeBack;doublememory;//記錄是否為數(shù)字分組//是否可以使用退格鍵//用于內存操作時保存的數(shù)據(jù)b)各功能函數(shù)簡介reset函數(shù)reSet()是把各屬性設置為原始值,當按下voidreSet(){answerText.setText("0.");textBuffer=newStringBuffer("");numDot=0;remFun=operator=0;firstValue=secondValue=result=0.0;enterSecond=false;forFirOrSec=1;b_remFir=b_remSec=b_remFun=false;remFir=remSec=0.0;canBeBack=true;}showScreen函數(shù)showScreen()是當按下了數(shù)字鍵后,在屏幕上顯示。如果有數(shù)字分組項,則調用數(shù)字分組函數(shù)。如為整數(shù)則在其后只顯示一個小數(shù)點,例如:數(shù)值5應該顯示為5.若為小數(shù),則直接顯示。voidshowScreen(){if(numDot==0)answerText.setText(textBuffe.rtoString()+".");elseanswerText.setText(textBuffe.rtoString());if(isNumGroup==true){showNumGroup();}}showScreenValue函數(shù)showScreenValue()是用于顯示計算后的結果值,具體的功能同上。voidshowScreenValue(){intresInteger=(int)result;if(Math.abs(result-resInteger)==0){StringBuffertmp=newStringBuffer(Double.toString(result));tmp.deleteCharAt(tmp.length()-1);answerText.setText(tmp.toString());}elseanswerText.setText(Double.toString(result));if(isNumGroup==true){showNumGroup();}}showNumGroup函數(shù)數(shù)字分組的顯示:每隔三位顯示一個逗號以示分隔。voidshowNumGroup(){inti,cnt=0;Stringstring=answerText.getText();Stringinterge,fraction;interge=fraction=string;for(i=0;i<string.length();i++){if(string.charAt(i)=='.'){interge=string.substring(0,i);fraction=string.substring(i+1,string.length());break;}}StringBuffersb=newStringBuffer(interge);sb.reverse();for(i=0;i<sb.length();i++){if(Character.isDigit(sb.charAt(i))){cnt++;if(cnt>3){cnt=0;sb.insert(i,",");}sb.reverse();answerText.setText(sb.toString()+"."+fraction);}deleteNumGroup函數(shù)deleteNumGroup()是當已經數(shù)字分組時,再次按下該鍵,消除數(shù)字分組的效果voiddeleteNumGroup(){StringBuffersb=newStringBuffer(answerText.getText());for(inti=0;i<sb.length();i++){if(sb.charAt(i)==','){sb.deleteCharAt(i);}}answerText.setText(sb.toString());}AddFunction函數(shù)當輸入了四則運算符時,先進行判斷各種雙目運算的可能性,若不是第一次運算操作則先把上一次的操作完成并在屏幕上顯示,并記錄下當前的操作符,否則存入操作符。voidAddFunction(intop){//如果此時第二個數(shù)存在.則運算,例如輸入2+3=5后按*4+if(b_remFir==true&&b_remFun==false&&enterSecond==true){if(operator==1)result=remFir+secondValue;elseif(operator==2)result=remFir-secondValue;elseif(operator==3)result=remFir*secondValue;elseif(operator==4)result=remFir/secondValue;b_remFir=true;remFir=result;enterSecond=false;forFirOrSec=2;operator=op;showScreenValue();elseif(b_remFir==false&&b_remFun==false&&enterSecond==true)if(operator==1)result=firstValue+secondValue;elseif(operator==2)result=firstValue-secondValue;elseif(operator==3)result=firstValue*secondValue;elseif(operator==4)result=firstValue/secondValue;b_remFir=true;remFir=result;enterSecond=false;forFirOrSec=2;operator=op;showScreenValue();}else{operator=op;forFirOrSec=2;}b_remFun=false;remFun=0;textBuffer=newStringBuffer("");}AddNum函數(shù)把屏幕上的值存入result和firstValuesecondValue中。voidAddNum(){if(forFirOrSec==1){result=firstValue=Double.parseDouble(textBuffer.toString());b_remFir=false;remFir=0;}elseif(forFirOrSec==2){enterSecond=true;secondValue=Double.parseDouble(textBuffer.toString());b_remSec=false;remSec=0;}}OnGo函數(shù)當按下了等于號時,先對各種鍵盤的輸入方法進行判斷,并對每種情況進行正確的操作。voidOnGo(){//如果記著第一,二個數(shù)和運算符,即上次算完后未輸入數(shù),而再次按=if(b_remFir==true&&b_remSec==true&&b_remFun==true){if(remFun==1)result=remFir+remSec;elseif(remFun==2)result=remFir-remSec;elseif(remFun==3)result=remFir*remSec;elseif(remFun==4)result=remFir/remSec;b_remFir=true;b_remSec=true;b_remFun=true;remFir=result;remSec=remSec;remFun=remFun;}//只記的第一數(shù),如算完2+3=5后按*4=elseif(b_remFir==true&&b_remSec==false&&b_remFun==false){if(operator==1)result=remFir+secondValue;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《家園與家人》課件
- 2024年模具回收再利用合同
- 2024年智慧城市建設投資設立智能交通公司合作協(xié)議范本3篇
- 2024年度跨省土石方運輸與環(huán)境保護責任合同3篇
- 2024年版房瑾與配偶財產分割合同
- 2025弱電工程合同范本()
- 2025涉外合同審查要點與分析
- 2024年農副產品質量安全檢測服務采購合同3篇
- 《科學技術》課件
- 2024年標準版建筑基礎施工合作合同版B版
- 普通胃鏡早期胃癌的診斷PPT課件
- DG∕T 154-2022 熱風爐
- 鐵路建設項目施工企業(yè)信用評價辦法(鐵總建設〔2018〕124號)
- 模具報價表精簡模板
- 抽樣檢驗培訓教材(共47頁).ppt
- 時光科技主軸S系列伺服控制器說明書
- 通用帶式輸送機TD75或DT型出廠檢驗要求及記錄
- 高考英語單項選擇題題庫題
- lonely-planet-PDF-大全
- 成人大專畢業(yè)生自我鑒定
- 汽車轉向系統(tǒng)設計規(guī)范
評論
0/150
提交評論