java 計算器


初識java:利用swing制作一個簡單的計算器,仿造window10內置計算器標准模式下的界面。

涉及學習內容:

  1. 設置窗口
  2. 設計界面按鍵
  3. 設置文本框:只讀
  4. String字符串操作:與double類型間的相互轉換
  5. 設置字體屬性
  6. 對計算器多種使用情況的考慮,如以加減法為例:
    1. 正常操作是輸入一個數后按+號再按另一個數字:12+15
    2. 考慮使用者先按+號,那么應該該顯示:0+,乘除則為1*;
    3. 考慮使用者按下+號鍵后反悔想使用減號;那么應當在還沒輸入另一個數值前進行更改:12+15+變12+15-,並且不影響結果
    4. 被除數不能為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();//直接定義主類的對象,調用方法就自動執行了
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM