楊建強 李苗在
(鶴壁職業(yè)技術學院電子信息工程學院,河南 鶴壁 458030)
基于Java Swing的計算器的設計與實現
楊建強 李苗在
(鶴壁職業(yè)技術學院電子信息工程學院,河南 鶴壁 458030)
計算器作為一種計算工具使用率非常高。本文利用Java語言的Swing、動作事件處理機制等技術開發(fā)了一個計算器,對于學習Java程序設計具有很大幫助,尤其對于《Java程序設計》課程的教學具有重要的指導作用。
計算器;Swing;Java
計算器作為一種計算工具使用頻率非常高,其操作過程也被人們所熟悉。在程序設計語言教學過程中,選取學生所熟悉的場景作為教學案例有利于激發(fā)學生的學習興趣和降低學生的畏懼心理,便于知識點的掌握和項目經驗的積累。本文利用Java語言的Swing、動作事件處理機制等技術設計和開發(fā)了一個計算器,對于學習Java程序設計具有很大幫助,尤其對于《Java程序設計》課程的教學具有重要的指導作用。
2.1 界面設計
Java程序里GUI(圖形用戶界面)設計用到的技術有AWT和Swing。其中,AWT是SUN公司推出的最早的一套API,包含的組件種類有限,只能提供基本的GUI設計,無法實現目前GUI設計需要的所有功能,并且開發(fā)出來的應用程序在不同的平臺上執(zhí)行時,界面的顯示會有所不同。為此,SUN公司對AWT進行了改進,提供了Swing組件,Swing不僅實現了AWT中的所有功能,提供了更加豐富的組件和功能,而且開發(fā)出來的應用程序可以在任何平臺上運行,不會出現界面顯示不同的問題。本設計就是利用Swing技術的相關組件構造了如圖1所示的界面。該界面共分為上中下三部分,上面部分是一個JTextField對象,中間部分是在一個設置為FlowLayout布局的JPanel對象上靠右放置兩個JButton對象,下面部分是一個設置為4行4列GridLayout布局的JPanel對象上放置16個JButton對象。這三部分分別放置在默認布局為BorderLayout的JFrame對象上的NORTH、CENTER和SOUTH區(qū)。
圖1 計算器界面
2.2 功能設計
計算器要能夠實現以下功能:
1)一個數的輸入和顯示。
2)輸入運算符,輸入完算術運算符后,先保存第一個操作數和運算符,為輸入第二個操作數做準備。
3)第二個操作數的輸入和顯示。
4)輸入完等號后能夠顯示運算結果。
5)退格功能的實現,沒按一下退格按鈕,輸入的操作數從低位刪除一位。
6)清空功能的實現,上一次運算結束后,點擊清空按鈕,為下一次運算做準備。
7)計算器的健壯性考慮,比如用戶在沒輸入第一個操作數時就先輸入運算符或等號。
8)計算器的友好交互性,比如程序剛啟動時和清空后,讓文本框內默認顯示為“0”。
3.1 Java Swing程序基本代碼實現
1)創(chuàng)建Java項目JiSuanQi,在項目里創(chuàng)建一個繼承于JFrame并包含main方法的類JiSuanQi.java。
2)在類內定義一個無參的構造函數,里面添加給窗體設置標題、初始位置、自適應窗口大小、窗體大小不可改變和窗體運行可見的代碼。代碼如下所示:
this.setTitle("計算器");
this.setLocation(100,100);
this.pack();
this.setResizable(false);
this.setVisible(true);
3)在構造函數的最下面設置窗體的關閉方式,代碼如下所示:
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
4)在main方法中創(chuàng)建JiSuanQi類的對象,使程序能夠正常運行。
3.2 計算器程序的界面實現
1)計算器界面的操作數輸入和結果顯示文本框代碼實現如下所示:
JTextField tField=new JTextField("0",20);
this.add(tField,BorderLayout.NORTH);
2)“退格”和“清空”按鈕的實現代碼如下所示:
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個按鈕的代碼實現是先把按鈕上的標識定義成一個字符數組,然后通過循環(huán)的方式依次取數組中的每個元素值作為新建JButton對象的文本。這樣極大地減少了編程的代碼量,也提高了代碼的可讀性。實現代碼如下所示:
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 計算器功能的實現 在Swing事件模型(如圖2所示)中由3個分離的對象完成對事件的處理,分別為事件源、事件和監(jiān)聽器。事件源觸發(fā)一個事件,它被一個或多個“監(jiān)聽器”接收,監(jiān)聽器負責處理事件。所謂事件監(jiān)聽器,實質上就是一個“實現特定類型監(jiān)聽器接口”的類對象,同時需要將接口中的方法一一實現。最后事件源調用相應的方法加載這個“實現特定類型監(jiān)聽器接口”的類對象,所有的事件源都具有添加或移除相應的事件監(jiān)聽器的方法。計算器功能的實現主要是通過用戶點擊界面上的相應按鈕,觸發(fā)動作事件,然后由為它添加的動作事件監(jiān)聽器負責處理。計算器是通過匿名內部類來創(chuàng)建事件監(jiān)聽器對象,針對所發(fā)生的事件進行處理。程序里需要給每個按鈕都添加動作事件監(jiān)聽器,實現代碼如下所示:qingong.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvente){ //具體的功能代碼實現 } }); 圖2 Swing事件模型 計算器程序里所用到的兩個操作數的位數是不確定的,需要先定義一個可變的字符串來保存用戶輸入的數字,還需要定義兩個double類型的變量來保存操作數,以及定義一個字符串來保存運算符。該部分代碼在整個程序中都要用到,故把這四個變量定義為靜態(tài)成員變量。代碼如下所示: static StringBuffer number=new StringBuffer(); static double number1=0,number2=0; static String flag; 3.3.1 正確使用計算器時的計算功能實現 所謂正確使用計算器是指用戶嚴格按照輸入第一操作數、運算符、第二個操作數、等號這樣的次序。計算器加減乘除四個功能的實現是一樣的,這里我們以乘法為例來介紹一下計算器的功能實現。 第一步,我們需要獲取用戶按的是哪個按鈕,Ac-tionEvent對象的getActionCommand方法可以返回與此動作相關的命令字符串。 第二步,由于我們是把16個按鈕通過循環(huán)結合button3對象布局到界面上的,所以用戶按這16個按鈕中的任何一個都將觸發(fā)綁定到button3上的觸發(fā)器。在形成第一個操作時我們需要排除4個運算符和等號,然后通過StringBuffer對象的append方法可以實現把多位操作數拼接起來并顯示。實現代碼如下所示: String aa=e.getActionCommand(); if(!(aa.equals("*")||aa.equals("+")||aa.equals("-")||aa.equals("/ ")||aa.equals("="))) {number.append(aa); tField.setText(number.toString());} 第三步,當用戶第一個操作數輸入完畢,輸入乘法符號時,此時代表用戶第一個操作數輸入完畢,我們可以先保存第一個操作數和運算符,然后清空number為保存第二個操作數做準備,最后把計算器顯示文本框中的內容置空。實現代碼如下所示: if(aa.equals("*")){ flag="*"; number1=Double.parseDouble(number.toString()); number.delete(0,number.length()); tField.setText(null); } 第四步,當用戶輸入第二個操作數時處理方法和第一個操作數一樣;待用戶輸入等號時,說明第二個操作數輸入完畢,需要程序根據用戶輸入的運算符進行計算并把最終結果顯示出來,最后清空number為下一次運算做準備。實現代碼如下所示: 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 不當使用計算器時的處理 用戶在使用計算器的過程中難免會出現使用不當的情況,比如,第一個操作數還沒輸入的時候先輸入了運算符或等號,第一個操作數輸入完后就輸入了等號等等,這類問題的解決方法是一樣的。在這我們以用戶先輸入乘號為例來說明這類問題,出現這種情況程序就會報錯,因為此時程序需要保存第一個操作數,而此時number為空,無法轉換成double類型的第一個操作數。解決方法為:在用戶按下乘號按鈕時,我們先判斷一下number中是否已保存值,如果有值,繼續(xù),如果無值,在顯示框中給出提示信息就可以順利解決了。實現代碼如下所示: if(!number.toString().equals("")){ //正常處理代碼 } else tField.setText("請先輸入第一個操作數!"); 1)清空功能的實現 該功能實現簡單,只需要清除number中保存的數就可以了,然后給顯示框設置為0,實現代碼如下所示: number.delete(0,number.length()); tField.setText("0"); 2)退格功能的實現 退格功能指的是用戶在輸入操作數的過程中把操作數的最后一位或某幾位輸入有誤,需要刪除后重新輸入。此時我們還要考慮用戶一直按退格按鈕會導致全部刪完還要刪引起的異常處理,所以我們在刪除前先判斷一下number的長度,只有其長度大于0時才允許刪除,提高了系統(tǒng)的健壯性,如果不能刪除時,給顯示框設置為0,提高了計算器的友好交互性。 if(number.length()>0){ number.deleteCharAt(number.length()-1); tField.setText(number.toString()); }else tField.setText("0"); 計算器的功能雖然與操作系統(tǒng)所帶的計算器相比,在功能上有所欠缺,但作為計算器的主體功能已經具備,加上其難易程度適中,綜合運用了Java的多個技術,而且便于初學者在理解一種操作運算后,自己去模仿實現其余操作運算,能對初學者起到舉一反三和引導的作用。在今后的工作中,將繼續(xù)完善此計算器程序的功能,使其更有利于初學者掌握Java程序設計。 [1]明日科技.Ja v a從入門到精通(第3版)[M].北京:清華大學出版社,2012. [2]傳智博客.Ja v a基礎入門[M].北京:清華大學出版社,2014. [3]楊建強.基于.NET的高職實驗報告管理信息系統(tǒng)的設計與實現[J].電腦開發(fā)與應用,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 楊建強(19 78-),男,河南滑縣人,碩士,副教授,研究方向為軟件開發(fā)、軟件工程。4 結束語
(Yuncheng University,Yuncheng 044000,Shanxi)