初學(xué)JAVA之實(shí)現(xiàn)計(jì)算器

ManAndRunning

這學(xué)期 Java 就快結(jié)課了,上機(jī)課最后布置了幾個(gè)題,最后一題要求寫一個(gè)計(jì)算器有點(diǎn)意思,記錄一下。

需求:

設(shè)計(jì)一個(gè)在windows系統(tǒng)中可以使用的“計(jì)算器”窗口并實(shí)現(xiàn)(+、-,×,÷等)其功能。

實(shí)現(xiàn)計(jì)算器,首先要有一個(gè)窗口:

// 創(chuàng)建窗口
final JFrame jf = new JFrame("計(jì)算器");
// 流動(dòng)布局,居中
jf.setLayout(new FlowLayout(1,5,5)); 
jf.setSize(293,251);
// 
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 不可以改變大小
jf.setResizable(false); 

// 創(chuàng)建容器,存放顯示數(shù)字框和 C 按鈕
JPanel panel1 = new JPanel();
// 定義按鈕面板,并設(shè)置為網(wǎng)格布局,4行4列,組件水平、垂直間距均為3
JPanel panel2 = new JPanel(new GridLayout(4,4,1,1));

有了窗口容器,就要往里面添加組件了。計(jì)算器首先要有一個(gè)文本框來顯示數(shù)字,然后還要有數(shù)字按鈕,加減乘除小數(shù)點(diǎn)等號(hào),最后還要一個(gè)刪除按鈕 C 。

然后一一添加即可。

// 創(chuàng)建文本域,放置輸入數(shù)據(jù)和結(jié)果
JTextArea text = new JTextArea(1,13);
// 設(shè)置字體
text.setFont(new Font(null, Font.PLAIN, 20));
// 設(shè)置大小
text.setPreferredSize(new Dimension(190,28));
// 不可編輯
text.setEditable(false);
panel1.add(text);

// 創(chuàng)建一個(gè)清除按鈕'C'
JButton btnC = new JButton("C");
btnC.setFont(new Font(null, Font.PLAIN, 20));
btnC.setPreferredSize(new Dimension(55,28));
panel1.add(btnC);

// 按鈕數(shù)組
String btn_str[] = {"1","2","3","/","4","5","6","*","7","8","9","-","0",".","=","+"};

JButton btn[] = new JButton[btn_str.length];
for(int i = 0 ; i < btn_str.length ; i++ ){
    btn[i]=new JButton(btn_str[i]);
    btn[i].setFont(new Font(null, Font.PLAIN, 20));
    btn[i].setPreferredSize(new Dimension(70,42));
    panel2.add(btn[i]);
}
        

這里通過循環(huán)創(chuàng)建按鈕數(shù)組。省時(shí)又省力,快樂好心情。

到這里面板內(nèi)容就做好了,接下來就需要為每個(gè)按鈕添加功能。

先來看數(shù)字按鈕和運(yùn)算符號(hào)按鈕:

// 按鈕功能
for(int i = 0 ; i < btn_str.length ; i++) {
    if(i != 14) {
    // 如果不是等于號(hào)
        int j = i;
        btn[i].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // 獲取文本框內(nèi)容
                String textStr = text.getText();
                // 如果有等號(hào),清空文本框
                if(textStr.indexOf("=") != -1) {
                text.setText("");
                    }
                // 獲取按鈕字符添加到文本框
                String s = btn[j].getText();
                text.append(s);
            }
            
        });
    }else {
    // 如果點(diǎn)擊等于號(hào)
        btn[i].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {  
                    // 獲取文本框內(nèi)容
                    String gongshi = text.getText();
                    // 計(jì)算公式
                    String jieguo = jse.eval(gongshi).toString();
                    
                    // 如果結(jié)果字符串過長,只顯示等號(hào)和結(jié)果
                    if(jieguo.length() > 18) {
                        jieguo = jieguo.substring(jieguo.length()-16, jieguo.length());
                        text.setText("=");
                        text.append(jieguo);
                    }else {
                        text.append("=");
                        text.append(jieguo);
                    }
               //如果出錯(cuò)
               } catch (Exception t) {  
                    text.setText("");
               }  
            }
        });
    }
}{           }// 皮皮狗子寫的!

i = 14 的時(shí)候呢,這個(gè)按鈕是 '=' 號(hào),所有要區(qū)別對(duì)待一下。

用戶點(diǎn)擊按鈕的時(shí)候,獲取到按鈕上的字符,然后將該字符添加的文本框內(nèi),當(dāng)用戶點(diǎn)擊等于號(hào)的時(shí)候進(jìn)行計(jì)算。

這里計(jì)算的時(shí)候用到了這個(gè)方法。

String jieguo = jse.eval(gongshi).toString();

通過下面這條語句引入這個(gè)方法。

static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");  

通過這個(gè)方法可以自動(dòng)將字符串類型的公式計(jì)算出結(jié)果,并且可以通過 try-catch 捕捉到錯(cuò)誤。

接下來實(shí)現(xiàn)刪除鍵 C :

// C 鍵 功能
btnC.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String textStr = text.getText();
        if(textStr.indexOf("=") != -1) {
            text.setText("");
        }else {
            textStr = textStr.substring(0,(textStr.length() - 1));
            text.setText(textStr);
        }
    }
    
});

最后將面板添加到窗口:

// 把 面板容器 設(shè)置到 窗口
    // panel1 設(shè)置到頂部
jf.getContentPane().add(panel1,BorderLayout.NORTH);
    // panel1 設(shè)置到底部
jf.getContentPane().add(panel2,BorderLayout.CENTER);
// 顯示窗口,前面創(chuàng)建的信息都在內(nèi)存中,通過 jf.setVisible(true) 把內(nèi)存中的窗口顯示在屏幕上。
jf.setVisible(true);

OK,一個(gè)簡單的計(jì)算器就完成了!

計(jì)算器

2018/6/12

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,211評(píng)論 3 119
  • 2017年12月3日上午,我們實(shí)驗(yàn)小學(xué)家長聽了宗彩博士生動(dòng)的教育講座,感謝有著大格局的劉校長給我們提供這次...
    倬兒不凡閱讀 6,609評(píng)論 0 2

友情鏈接更多精彩內(nèi)容