Java實(shí)現(xiàn)簡單圖形界面計(jì)算器
前言
因?yàn)檫@兩天我們的Java實(shí)驗(yàn)課程需要做兩個(gè)小的圖形化界面,其中就有一個(gè)圖形界面的計(jì)算器,所以稍微花了點(diǎn)時(shí)間做了一個(gè),同時(shí)復(fù)習(xí)了一下Java的基礎(chǔ)內(nèi)容和GUI編程。因?yàn)榇a中的注釋特別詳細(xì),所以這里就不講解怎么實(shí)現(xiàn)的了。
代碼
package zuoye; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Stack; class MyException extends Exception{ ? ? public MyException() { ? ? ? ? super(); ? ? } ? ? public MyException(String message) { ? ? ? ? super(message); ? ? } } public class MyCalculator extends JFrame{ ? ? /* ? ? ?*? ? ? ?*/ ? ? private JTextField textField; ? ?//輸入文本框 ? ? private String input; ? ? ?//結(jié)果 ? ? private String operator; ? ?//操作符 ? ? public MyCalculator() { ? ? ? ? input = ""; ? ? ? ? operator = ""; ? ? ? ? JPanel panel = new JPanel(); ? ? ? ? textField = new JTextField(30); ? ? ? ? textField.setEditable(false); ? ? ? ? ? ? ? ? ? ? ? //文本框禁止編輯 ? ? ? ? textField.setHorizontalAlignment(JTextField.LEFT); ? ? ? ? //textField.setBounds(100, 100, 20, 20); ? ? ? ? ? ?//在容器布局為空情況下生效 ? ? ? ? textField.setPreferredSize(new Dimension(200,30));//設(shè)置該組件的初始大小 ? ? ? ? //將textField加入本JFrame中,布局為邊界布局,位置為north ? ? ? ? this.add(textField, BorderLayout.NORTH); ? ? ? ? String[] name= {"7","8","9","+","4","5","6","-","1","2","3","*","0","C","=","/"}; ? ? ? ? //將這個(gè)panel的布局設(shè)置為網(wǎng)格布局,有四行四列,行間距和列間距為1 ? ? ? ? panel.setLayout(new GridLayout(4,4,1,1)); ? ? ? ? for(int i=0;i<name.length;i++) { ? ? ? ? ? ? JButton button = new JButton(name[i]); ? ? ? ? ? ? //設(shè)置按鈕的時(shí)間監(jiān)聽 ? ? ? ? ? ? button.addActionListener(new MyActionListener()); ? ? ? ? ? ? //將按鈕加入到panel中 ? ? ? ? ? ? panel.add(button); ? ? ? ? } ? ? ? ? //將panel加入到本JFrame中,布局為邊界布局,位置為centre ? ? ? ? this.add(panel,BorderLayout.CENTER); ? ? } ? ? class MyActionListener implements ActionListener{ ? //內(nèi)部類實(shí)現(xiàn)按鈕響應(yīng) ? ? ? ? @Override ? ? ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? ? ? int cnt=0; ? ? ? ? ? ? String actionCommand = e.getActionCommand(); ? //獲取按鈕上的字符串 ? ? ? ? ? ? if(actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*") ? ? ? ? ? ? ? ? || actionCommand.equals("/")) { ? ? ? ? ? ? ? ? input += " " + actionCommand + " "; ? ? ? ? ? ? } ? ? ? ? ? ? else if(actionCommand.equals("C")) { ? //清除輸入 ? ? ? ? ? ? ? ? input = ""; ? ? ? ? ? ? } ? ? ? ? ? ? else if(actionCommand.equals("=")) { ? //按下等號 ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? input+= "="+calculate(input); ? ? ? ? ? ? ? ? } catch (MyException e1) { ? ? ? ? ? ? ? ? ? ? if(e1.getMessage().equals("被除數(shù)不能為0")) ? ? ? ? ? ? ? ? ? ? ? ? input = e1.getMessage(); ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? input = e1.getMessage(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? textField.setText(input); ? ? ? ? ? ? ? ? input=""; ? ? ? ? ? ? ? ? cnt = 1; ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? ? ? input += actionCommand; ? ? //按下數(shù)字 ? ? ? ? ? ? //因?yàn)槿绻话础?”按鈕cnt一直未0,所以可以保證顯示輸入的數(shù)字和操作鍵 ? ? ? ? ? ? if(cnt == 0) ? ? ? ? ? ? ? ? textField.setText(input); ? ? ? ? } ? ? } ? ? //這里需要借助棧來完成表達(dá)式的計(jì)算,首先將字符串分割成字符串?dāng)?shù)組, ? ? //由中綴的定義知數(shù)組奇數(shù)位為運(yùn)算符(從第0位開始),偶數(shù)位為操作數(shù), ? ? // 因此可將偶數(shù)為操作數(shù)進(jìn)棧,遇見+(-)運(yùn)算符,則將下一個(gè)數(shù)以正(負(fù))的形式壓人棧中, ? ? // 遇見*或/運(yùn)算符,則將棧頂元素出棧與數(shù)組后一元素進(jìn)行計(jì)算,并將其結(jié)果重新壓入棧中, ? ? // 直至遍歷至數(shù)組最后一個(gè)元素。 ? ? private String calculate(String input) throws MyException{ ? ?//計(jì)算函數(shù) ? ? ? ? String[] comput = input.split(" "); ? ? ? ? //System.out.println(input); ? ? ? ? Stack<Double> stack = new Stack<>(); ? ? ? ? Double m = Double.parseDouble(comput[0]); ? ? ? ? stack.push(m); ? ? ? //第一個(gè)操作數(shù)入棧 ? ? ? ? for(int i = 1; i < comput.length; i++) { ? ? ? ? ? ? if(i%2==1) { ? ? ? ? ? ? ? ? if(comput[i].equals("+")) ? ? ? ? ? ? ? ? ? ? stack.push(Double.parseDouble(comput[i+1])); ? ? ? ? ? ? ? ? if(comput[i].equals("-")) ? ? ? ? ? ? ? ? ? ? stack.push(-Double.parseDouble(comput[i+1])); ? ? ? ? ? ? ? ? if(comput[i].equals("*")) { ? //將前一個(gè)數(shù)出棧做乘法再入棧 ? ? ? ? ? ? ? ? ? ? Double d = stack.peek(); ? //取棧頂元素 ? ? ? ? ? ? ? ? ? ? stack.pop(); ? ? ? ? ? ? ? ? ? ? stack.push(d*Double.parseDouble(comput[i+1])); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if(comput[i].equals("/")) { ? //將前一個(gè)數(shù)出棧做乘法再入棧 ? ? ? ? ? ? ? ? ? ? double help = Double.parseDouble(comput[i+1]); ? ? ? ? ? ? ? ? ? ? if(help == 0) ? ? ? ? ? ? ? ? ? ? ? ? throw new MyException("被除數(shù)不能為0"); ? ?//不會繼續(xù)執(zhí)行該函數(shù) ? ? ? ? ? ? ? ? ? ? double d = stack.peek(); ? ? ? ? ? ? ? ? ? ? stack.pop(); ? ? ? ? ? ? ? ? ? ? stack.push(d/help); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? double d = 0d; ? ? ? ? while(!stack.isEmpty()) { ? //求和 ? ? ? ? ? ? d += stack.peek(); ? ? ? ? ? ? stack.pop(); ? ? ? ? } ? ? ? ? String result = String.valueOf(d); ? ? ? ? return result; ? ? } ? ? public static void main(String[] args) { ? ? ? ? JFrame f = new MyCalculator(); ? ? ? ? f.setTitle(f.getClass().getSimpleName()); ? ? ? ? f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ? ? ? ? f.setBounds(400, 200, 500, 300); ? ? ? ? f.setVisible(true); ? ? } }
實(shí)現(xiàn)效果
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解
這篇文章主要介紹了Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解,通常我們會提供一個(gè)模板,此模塊我們可以使用easyExcel導(dǎo)出數(shù)據(jù)生成的一個(gè)Excel文件當(dāng)作模板,提供下載鏈接,用戶在該文件內(nèi)填入規(guī)定的數(shù)據(jù)格式以后可以批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中,需要的朋友可以參考下2023-08-08DUCC配置平臺實(shí)現(xiàn)一個(gè)動態(tài)化線程池示例代碼
這篇文章主要為大家介紹了DUCC配置平臺實(shí)現(xiàn)一個(gè)動態(tài)化線程池示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Struts2通過自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Struts2通過自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法,介紹了定義Struts2的自定義標(biāo)簽的三個(gè)步驟以及詳細(xì)解釋,需要的朋友可以參考下。2017-09-09Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析
這篇文章主要介紹了Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析,反射的實(shí)現(xiàn)和interface的組成很相似,都是由“類型”和“數(shù)據(jù)值”構(gòu)成,下面小編分享更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-06-06Java中Map實(shí)現(xiàn)線程安全的3種方式
本文主要介紹了Java中Map實(shí)現(xiàn)線程安全的3種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Centos中yum方式安裝java的實(shí)現(xiàn)示例
這篇文章主要介紹了Centos中yum方式安裝java的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04