楊建強(qiáng) 李苗在
(鶴壁職業(yè)技術(shù)學(xué)院電子信息工程學(xué)院,河南 鶴壁 458030)
基于Java Swing的計算器的設(shè)計與實(shí)現(xiàn)
楊建強(qiáng) 李苗在
(鶴壁職業(yè)技術(shù)學(xué)院電子信息工程學(xué)院,河南 鶴壁 458030)
計算器作為一種計算工具使用率非常高。本文利用Java語言的Swing、動作事件處理機(jī)制等技術(shù)開發(fā)了一個計算器,對于學(xué)習(xí)Java程序設(shè)計具有很大幫助,尤其對于《Java程序設(shè)計》課程的教學(xué)具有重要的指導(dǎo)作用。
計算器;Swing;Java
計算器作為一種計算工具使用頻率非常高,其操作過程也被人們所熟悉。在程序設(shè)計語言教學(xué)過程中,選取學(xué)生所熟悉的場景作為教學(xué)案例有利于激發(fā)學(xué)生的學(xué)習(xí)興趣和降低學(xué)生的畏懼心理,便于知識點(diǎn)的掌握和項(xiàng)目經(jīng)驗(yàn)的積累。本文利用Java語言的Swing、動作事件處理機(jī)制等技術(shù)設(shè)計和開發(fā)了一個計算器,對于學(xué)習(xí)Java程序設(shè)計具有很大幫助,尤其對于《Java程序設(shè)計》課程的教學(xué)具有重要的指導(dǎo)作用。
2.1 界面設(shè)計
Java程序里GUI(圖形用戶界面)設(shè)計用到的技術(shù)有AWT和Swing。其中,AWT是SUN公司推出的最早的一套API,包含的組件種類有限,只能提供基本的GUI設(shè)計,無法實(shí)現(xiàn)目前GUI設(shè)計需要的所有功能,并且開發(fā)出來的應(yīng)用程序在不同的平臺上執(zhí)行時,界面的顯示會有所不同。為此,SUN公司對AWT進(jìn)行了改進(jìn),提供了Swing組件,Swing不僅實(shí)現(xiàn)了AWT中的所有功能,提供了更加豐富的組件和功能,而且開發(fā)出來的應(yīng)用程序可以在任何平臺上運(yùn)行,不會出現(xiàn)界面顯示不同的問題。本設(shè)計就是利用Swing技術(shù)的相關(guān)組件構(gòu)造了如圖1所示的界面。該界面共分為上中下三部分,上面部分是一個JTextField對象,中間部分是在一個設(shè)置為FlowLayout布局的JPanel對象上靠右放置兩個JButton對象,下面部分是一個設(shè)置為4行4列GridLayout布局的JPanel對象上放置16個JButton對象。這三部分分別放置在默認(rèn)布局為BorderLayout的JFrame對象上的NORTH、CENTER和SOUTH區(qū)。

圖1 計算器界面
2.2 功能設(shè)計
計算器要能夠?qū)崿F(xiàn)以下功能:
1)一個數(shù)的輸入和顯示。
2)輸入運(yùn)算符,輸入完算術(shù)運(yùn)算符后,先保存第一個操作數(shù)和運(yùn)算符,為輸入第二個操作數(shù)做準(zhǔn)備。
3)第二個操作數(shù)的輸入和顯示。
4)輸入完等號后能夠顯示運(yùn)算結(jié)果。
5)退格功能的實(shí)現(xiàn),沒按一下退格按鈕,輸入的操作數(shù)從低位刪除一位。
6)清空功能的實(shí)現(xiàn),上一次運(yùn)算結(jié)束后,點(diǎn)擊清空按鈕,為下一次運(yùn)算做準(zhǔn)備。
7)計算器的健壯性考慮,比如用戶在沒輸入第一個操作數(shù)時就先輸入運(yùn)算符或等號。
8)計算器的友好交互性,比如程序剛啟動時和清空后,讓文本框內(nèi)默認(rèn)顯示為“0”。
3.1 Java Swing程序基本代碼實(shí)現(xiàn)
1)創(chuàng)建Java項(xiàng)目JiSuanQi,在項(xiàng)目里創(chuàng)建一個繼承于JFrame并包含main方法的類JiSuanQi.java。
2)在類內(nèi)定義一個無參的構(gòu)造函數(shù),里面添加給窗體設(shè)置標(biāo)題、初始位置、自適應(yīng)窗口大小、窗體大小不可改變和窗體運(yùn)行可見的代碼。代碼如下所示:
this.setTitle("計算器");
this.setLocation(100,100);
this.pack();
this.setResizable(false);
this.setVisible(true);
3)在構(gòu)造函數(shù)的最下面設(shè)置窗體的關(guān)閉方式,代碼如下所示:
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
4)在main方法中創(chuàng)建JiSuanQi類的對象,使程序能夠正常運(yùn)行。
3.2 計算器程序的界面實(shí)現(xiàn)
1)計算器界面的操作數(shù)輸入和結(jié)果顯示文本框代碼實(shí)現(xiàn)如下所示:
JTextField tField=new JTextField("0",20);
this.add(tField,BorderLayout.NORTH);
2)“退格”和“清空”按鈕的實(shí)現(xiàn)代碼如下所示:
JPanel panel=new JPanel(new FlowLayout(FlowLayout. RIGHT));
JButton tuige=new JButton("退格");
JButton qingong=new JButton("清空");
panel.add(tuige);
panel.add(qingong);
this.add(panel);
3)計算器16個按鈕的代碼實(shí)現(xiàn)是先把按鈕上的標(biāo)識定義成一個字符數(shù)組,然后通過循環(huán)的方式依次取數(shù)組中的每個元素值作為新建JButton對象的文本。這樣極大地減少了編程的代碼量,也提高了代碼的可讀性。實(shí)現(xiàn)代碼如下所示:
JPanel panel2=new JPanel(new GridLayout(4,4,5,5));
String[]bStrings={"7","8","9","+","4","5","6","-","1","2"," 3","*","0",".","=","/"};
for(int i=0;i JButton button3=new JButton(bStrings[i]); panel2.add(button3); } this.add(panel2,BorderLayout.SOUTH); 3.3 計算器功能的實(shí)現(xiàn) 在Swing事件模型(如圖2所示)中由3個分離的對象完成對事件的處理,分別為事件源、事件和監(jiān)聽器。事件源觸發(fā)一個事件,它被一個或多個“監(jiān)聽器”接收,監(jiān)聽器負(fù)責(zé)處理事件。所謂事件監(jiān)聽器,實(shí)質(zhì)上就是一個“實(shí)現(xiàn)特定類型監(jiān)聽器接口”的類對象,同時需要將接口中的方法一一實(shí)現(xiàn)。最后事件源調(diào)用相應(yīng)的方法加載這個“實(shí)現(xiàn)特定類型監(jiān)聽器接口”的類對象,所有的事件源都具有添加或移除相應(yīng)的事件監(jiān)聽器的方法。計算器功能的實(shí)現(xiàn)主要是通過用戶點(diǎn)擊界面上的相應(yīng)按鈕,觸發(fā)動作事件,然后由為它添加的動作事件監(jiān)聽器負(fù)責(zé)處理。計算器是通過匿名內(nèi)部類來創(chuàng)建事件監(jiān)聽器對象,針對所發(fā)生的事件進(jìn)行處理。程序里需要給每個按鈕都添加動作事件監(jiān)聽器,實(shí)現(xiàn)代碼如下所示:qingong.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvente){ //具體的功能代碼實(shí)現(xiàn) } }); 圖2 Swing事件模型 計算器程序里所用到的兩個操作數(shù)的位數(shù)是不確定的,需要先定義一個可變的字符串來保存用戶輸入的數(shù)字,還需要定義兩個double類型的變量來保存操作數(shù),以及定義一個字符串來保存運(yùn)算符。該部分代碼在整個程序中都要用到,故把這四個變量定義為靜態(tài)成員變量。代碼如下所示: static StringBuffer number=new StringBuffer(); static double number1=0,number2=0; static String flag; 3.3.1 正確使用計算器時的計算功能實(shí)現(xiàn) 所謂正確使用計算器是指用戶嚴(yán)格按照輸入第一操作數(shù)、運(yùn)算符、第二個操作數(shù)、等號這樣的次序。計算器加減乘除四個功能的實(shí)現(xiàn)是一樣的,這里我們以乘法為例來介紹一下計算器的功能實(shí)現(xiàn)。 第一步,我們需要獲取用戶按的是哪個按鈕,Ac-tionEvent對象的getActionCommand方法可以返回與此動作相關(guān)的命令字符串。 第二步,由于我們是把16個按鈕通過循環(huán)結(jié)合button3對象布局到界面上的,所以用戶按這16個按鈕中的任何一個都將觸發(fā)綁定到button3上的觸發(fā)器。在形成第一個操作時我們需要排除4個運(yùn)算符和等號,然后通過StringBuffer對象的append方法可以實(shí)現(xiàn)把多位操作數(shù)拼接起來并顯示。實(shí)現(xiàn)代碼如下所示: String aa=e.getActionCommand(); if(!(aa.equals("*")||aa.equals("+")||aa.equals("-")||aa.equals("/ ")||aa.equals("="))) {number.append(aa); tField.setText(number.toString());} 第三步,當(dāng)用戶第一個操作數(shù)輸入完畢,輸入乘法符號時,此時代表用戶第一個操作數(shù)輸入完畢,我們可以先保存第一個操作數(shù)和運(yùn)算符,然后清空number為保存第二個操作數(shù)做準(zhǔn)備,最后把計算器顯示文本框中的內(nèi)容置空。實(shí)現(xiàn)代碼如下所示: if(aa.equals("*")){ flag="*"; number1=Double.parseDouble(number.toString()); number.delete(0,number.length()); tField.setText(null); } 第四步,當(dāng)用戶輸入第二個操作數(shù)時處理方法和第一個操作數(shù)一樣;待用戶輸入等號時,說明第二個操作數(shù)輸入完畢,需要程序根據(jù)用戶輸入的運(yùn)算符進(jìn)行計算并把最終結(jié)果顯示出來,最后清空number為下一次運(yùn)算做準(zhǔn)備。實(shí)現(xiàn)代碼如下所示: if(aa.equals("=")){ number2=Double.parseDouble(number.toString()); if(flag.equals("*")){ double chengji=number1*number2; String ji=String.valueOf(chengji); tField.setText(ji); number.delete(0,number.length()); } } 3.3.2 不當(dāng)使用計算器時的處理 用戶在使用計算器的過程中難免會出現(xiàn)使用不當(dāng)?shù)那闆r,比如,第一個操作數(shù)還沒輸入的時候先輸入了運(yùn)算符或等號,第一個操作數(shù)輸入完后就輸入了等號等等,這類問題的解決方法是一樣的。在這我們以用戶先輸入乘號為例來說明這類問題,出現(xiàn)這種情況程序就會報錯,因?yàn)榇藭r程序需要保存第一個操作數(shù),而此時number為空,無法轉(zhuǎn)換成double類型的第一個操作數(shù)。解決方法為:在用戶按下乘號按鈕時,我們先判斷一下number中是否已保存值,如果有值,繼續(xù),如果無值,在顯示框中給出提示信息就可以順利解決了。實(shí)現(xiàn)代碼如下所示: if(!number.toString().equals("")){ //正常處理代碼 } else tField.setText("請先輸入第一個操作數(shù)!"); 1)清空功能的實(shí)現(xiàn) 該功能實(shí)現(xiàn)簡單,只需要清除number中保存的數(shù)就可以了,然后給顯示框設(shè)置為0,實(shí)現(xiàn)代碼如下所示: number.delete(0,number.length()); tField.setText("0"); 2)退格功能的實(shí)現(xiàn) 退格功能指的是用戶在輸入操作數(shù)的過程中把操作數(shù)的最后一位或某幾位輸入有誤,需要刪除后重新輸入。此時我們還要考慮用戶一直按退格按鈕會導(dǎo)致全部刪完還要刪引起的異常處理,所以我們在刪除前先判斷一下number的長度,只有其長度大于0時才允許刪除,提高了系統(tǒng)的健壯性,如果不能刪除時,給顯示框設(shè)置為0,提高了計算器的友好交互性。 if(number.length()>0){ number.deleteCharAt(number.length()-1); tField.setText(number.toString()); }else tField.setText("0"); 計算器的功能雖然與操作系統(tǒng)所帶的計算器相比,在功能上有所欠缺,但作為計算器的主體功能已經(jīng)具備,加上其難易程度適中,綜合運(yùn)用了Java的多個技術(shù),而且便于初學(xué)者在理解一種操作運(yùn)算后,自己去模仿實(shí)現(xiàn)其余操作運(yùn)算,能對初學(xué)者起到舉一反三和引導(dǎo)的作用。在今后的工作中,將繼續(xù)完善此計算器程序的功能,使其更有利于初學(xué)者掌握J(rèn)ava程序設(shè)計。 [1]明日科技.Ja v a從入門到精通(第3版)[M].北京:清華大學(xué)出版社,2012. [2]傳智博客.Ja v a基礎(chǔ)入門[M].北京:清華大學(xué)出版社,2014. [3]楊建強(qiáng).基于.NET的高職實(shí)驗(yàn)報告管理信息系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].電腦開發(fā)與應(yīng)用,2013(9):51-53. The Design and Realization of Logistics Management System Based on C#.net Xia Binhao Lou Yishu Zhang Yiqiong With the high-speed development of computer network,computer has played a vital role in each domain of the society.The logistics management system based on C#.net makes the requirements of logistics management more systematic and more standardized.This system not only reduces company's operation cost,but also raises the working efficiency greatly. C#.net;logistics management system;systematic;standardization TP311.11 A 1008-6609(2016)10-0061-03 楊建強(qiáng)(19 78-),男,河南滑縣人,碩士,副教授,研究方向?yàn)檐浖_發(fā)、軟件工程。
4 結(jié)束語
(Yuncheng University,Yuncheng 044000,Shanxi)