計算器
運用Java語言和NetBeans工具設計一個簡易的計算器,計算器看似簡單,其中各種功能的實現需要涉及很多知識點,下面我來簡單的闡述一下設計計算器的步驟以及遇到的一些問題。
一、設計計算器的步驟
1、打開NetBeans,文件-新建-在類別中選擇Java-下一步-寫上項目名(caculator)選擇項目位置-點擊完成。
2、選中caculator包右擊,新建-JFrame窗體,在設計界面設計計算器的界面,步驟如下:先放入一個拆分窗格,然後依次放入一個文本字段和十八個按鈕,佈局好後,分別選中按鈕,右擊設置按鈕的變量名稱和按鈕上的文本,設置完如下圖。
3、實現計算器各種功能的代碼
在JFrame下先創建一個setNum方法,然後依次右擊按鈕-事件-Mouse-mouseReleased,添加鼠標的釋放事件的方法,並在各個按鈕的釋放事件方法中使用setNum()調用JFrame中的setNum()方法。即可實現點擊按鈕相應的數字能進入JTextField文本域中。
setNum()方法的代碼如下:
//創建setNum方法
public void setNum(String str){
//獲得顯示文本內容保存到strText
String strText=jTextField1.getText();
//如果文本內容是0,那麼改爲str,否則追加
if(strText.equals("0")){
jTextField1.setText(str);
}else{ //追加
//使用構造方法初始化StringBuffer,並賦值strText
StringBuffer strBuf=new StringBuffer(strText);
//追加str到當前StringBuffer對象(strText)的末尾
strBuf.append(str); //追加str
//重新設置文本內容爲strBuf
jTextField1.setText(strBuf.toString());
// jTextField1.setText(strText+str);
}
}
上面的功能實現後,設置等於的MouseReleased事件的方法,實現點擊等於時,將計算結果顯示在文本域中。代碼如下:
//等於
private void dengyuMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
/*ScriptEngineManager 爲 ScriptEngine 類實現一個發現和實例化機制,
還維護一個鍵/值對集合來存儲所有 Manager 創建的引擎所共享的狀態。
*/
ScriptEngineManager manager=new ScriptEngineManager();
//查找並創建一個給定名稱的 ScriptEngine
ScriptEngine se=manager.getEngineByName("js");
Double result=null;
try {
result=(Double) se.eval("("+jTextField1.getText()+")*1.0");
} catch (ScriptException ex) {
Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);
}
jTextField1.setText(result.toString());
}
4、實現回退的功能,設置回退按鈕的MouseReleased事件的方法,該按鈕實現當點擊該按鈕時,文本域中刪除一個字符。
代碼如下://箭頭
private void jiantouMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
//獲得顯示文本內容保存到strText
String strText=jTextField1.getText();
//判斷strText的長度
if(strText.length()>1){
StringBuffer strBuf=new StringBuffer(strText);
//刪除指定位置的字符,然後將剩餘的內容形成新的字符串。
strBuf.deleteCharAt(strBuf.length()-1);
jTextField1.setText(strBuf.toString());
}else{
jTextField1.setText("0");
}
}
5、實現清空的功能,設置清空按鈕的MouseReleased事件的方法,該按鈕實現當點擊該按鈕時,文本域中的字符被清空。
代碼如下:
//清空
private void qingkongMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
jTextField1.setText("0");
}
6、規範運算符,在JFrame下先創建一個setYSF()方法,該方法實現當點擊一個運算符時,發現點錯,想點擊正確的運算符能直接實現運算符的切換功能。代碼如下:
//規範運算符
public void setYSF(String str){
//取出當前顯示的內容放到字符串變量strText中
String strText=jTextField1.getText();
//判斷strText中字符串的最右邊一位是否爲運算符
/* 如果(最右邊是運算符){
//替換strText最右邊的運算符爲當前按鍵str
//strText放回文本框
}否則{
//strText追加當前的str
//strText放回
}*/
int lastRight=strText.length()-1; //當前字符串的長度-1
char ch=strText.charAt(lastRight); //ch存放最右邊的一個字符
if(ch=='+'||ch=='-'|| ch=='*' ||ch=='/'){
//替換strText最右邊的運算符爲當前按鍵str,比如"1234","123"
String strResult=strText.substring(0,lastRight)+str;
//strText,strResult放回文本框
jTextField1.setText(strResult);
}else{
//strText追加當前的str
//strText放回
jTextField1.setText(strText+str);
}
}
7、美化計算器的界面。爲了計算器的外觀更美觀, 可以給計算器添加背景圖片。步驟如下:
在JFrame-導航器中,選中JFrame,右擊 從組件面板上添加-Swing容器-分層窗格、面板1和麪板2。將計算器中的組件放入面板1中,將圖片放入面板2中。在面板2中添加jLabel,選中jLabel右擊屬性,找到icon-點擊-彈出如下的界面
選擇外部圖像,將提前找好的圖片導入到項目中,然後選擇項目內的圖像,選中圖像。回到設計界面,分別設置分層窗體、面板1、面板2和圖片的大小。設置完成後,運行項目,如下圖:
8、附加功能:在此基礎上,爲了使鼠標經過按鈕時變色,分別給按鈕添加了MouseExited和MouseEntered的事件,在JFrame下先創建 mouseEnter和mouseExited方法,鼠標進入按鈕和離開按鈕時分別調用這兩個方法,代碼如下:
public void mouseEnter(int color){
JButton b[]=new JButton[]
{zero,one,two,three,four,five,six,serven,eight,nine,point,jia,jian,cheng,chu,jiantou,qingkong,dengyu};
for(int i = 0;i<b.length;i++){
b[i].setBackground(Color.YELLOW);
}
//one.setBackground(Color.orange);
}
public void mouseExited(int color){
JButton b[]=new JButton[]
{zero,one,two,three,four,five,six,serven,eight,nine,point,jia,jian,cheng,chu,jiantou,qingkong,dengyu};
for(int i = 0;i<b.length;i++){
b[i].setBackground(Color.getColor(""));
}
// one.setBackground(Color.getColor(""));
}
該方法實現實現了當鼠標進入其中任何一個按鈕時,所有的按鈕變色,當離開按鈕時,按鈕恢復爲原來的顏色。
二、問題總結
在開始設計計算器的時候,認爲計算器很簡單,但當實際操作時,會發現很多問題。比如在一開始的界面設計時,按鈕的位置和大小的調整,這個地方要很有耐心的調整按鈕到合適的位置。在實現計算器的功能時,學到了很多新的知識,比如StringBuffer類的使用:StringBuffer對象的初始化
StringBuffer對象的初始化不像String類的初始化一樣,Java提供的有特殊的語法,而通常情況下一般使用構造方法進行初始化。
例如:StringBuffer s = new StringBuffer();
這樣初始化出的StringBuffer對象是一個空的對象。
如果需要創建帶有內容的StringBuffer對象,則可以使用:
StringBuffer s = new StringBuffer(“abc”);
這樣初始化出的StringBuffer對象的內容就是字符串”abc”。
需要注意的是,StringBuffer和String屬於不同的類型,也不能直接進行強制類型轉換,下面的代碼都是錯誤的:
StringBuffer s = “abc”; //賦值類型不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在繼承關係,無法進行強轉
StringBuffer對象和String對象之間的互轉的代碼如下:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String轉換爲StringBuffer
String s1 = sb1.toString(); //StringBuffer轉換爲String
總之,在設計過程中遇到了很多問題也學到了一些類和方法的使用,我覺得這對以後的學習會有很大的幫助。當然,我會再接再厲,努力掌握好基礎知識,才能在以後的項目設計中更輕鬆。