最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)簡單圖形界面計(jì)算器

 更新時(shí)間:2022年04月26日 09:09:49   作者:Jivan2233  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單圖形界面計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

因?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"); ? ?//不會(huì)繼續(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的三種IO模型詳解(BIO、NIO、AIO)

    java的三種IO模型詳解(BIO、NIO、AIO)

    本文介紹了BIO、NIO和AIO三種不同的IO模型,分別分析了它們的工作機(jī)制、實(shí)現(xiàn)方式以及與BIO的對比,BIO是阻塞的,每個(gè)連接需要一個(gè)線程;NIO是同步非阻塞的,通過緩沖區(qū)和選擇器實(shí)現(xiàn)I/O多路復(fù)用;AIO是異步的,操作系統(tǒng)處理IO操作,完成后通知應(yīng)用程序
    2024-11-11
  • Mybatis流式查詢并實(shí)現(xiàn)將結(jié)果分批寫入文件

    Mybatis流式查詢并實(shí)現(xiàn)將結(jié)果分批寫入文件

    這篇文章主要介紹了Mybatis流式查詢并實(shí)現(xiàn)將結(jié)果分批寫入文件方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java中stream是什么及如何使用

    Java中stream是什么及如何使用

    在Java中,Stream(流)是一種用于操作集合(Collection)、數(shù)組等數(shù)據(jù)源的API,Stream的主要作用是進(jìn)行數(shù)據(jù)的轉(zhuǎn)換、篩選、聚合等操作,可以極大地簡化對數(shù)據(jù)的處理,本文給大家介紹Java中stream是什么?有什么作用?如何使用?感興趣的朋友一起看看吧
    2023-10-10
  • SpringBoot自定義注解解決公共字段填充問題解決

    SpringBoot自定義注解解決公共字段填充問題解決

    修改時(shí)間,修改人等字段時(shí),這些字段屬于公共字段,本文主要介紹了SpringBoot自定義注解解決公共字段填充問題解決,使用它的好處就是可以統(tǒng)一對這些字段進(jìn)行處理,感興趣的可以了解一下
    2024-07-07
  • 詳解Java的Spring框架下bean的自動(dòng)裝載方式

    詳解Java的Spring框架下bean的自動(dòng)裝載方式

    這篇文章主要介紹了Java的Spring框架下bean的自動(dòng)裝載方式,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • Spring中Bean注入源碼示例解析

    Spring中Bean注入源碼示例解析

    這篇文章主要為大家介紹了Spring中Bean注入源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開發(fā)工作中,處理數(shù)據(jù)庫查詢是一個(gè)非常常見的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時(shí),如何編寫高效、簡潔且可維護(hù)的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • MyBatis中#{}和${}有哪些區(qū)別

    MyBatis中#{}和${}有哪些區(qū)別

    大家好,本篇文章主要講的是MyBatis中#{}和${}區(qū)別,感興趣的同學(xué)趕快來看一看,對你有幫助的話記得收藏一下,方向下次瀏覽
    2021-12-12
  • ReentrantReadWriteLock不能鎖升級的原因總結(jié)

    ReentrantReadWriteLock不能鎖升級的原因總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Java并發(fā)的相關(guān)知識,文章圍繞著為什么ReentrantReadWriteLock不能鎖升級展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • spring boot集成mongodb的增刪改查的示例代碼

    spring boot集成mongodb的增刪改查的示例代碼

    這篇文章主要介紹了spring boot集成mongodb的增刪改查的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

贡山| 兰西县| 皮山县| 广宗县| 鹤岗市| 尼勒克县| 罗甸县| 武功县| 庆元县| 和顺县| 云龙县| 昌图县| 南澳县| 滨州市| 平南县| 呼和浩特市| 临海市| 德保县| 台江县| 黄骅市| 莱州市| 禹州市| 固镇县| 双鸭山市| 南康市| 南安市| 西华县| 凤庆县| 陇西县| 定襄县| 镇雄县| 郸城县| 开封市| 双牌县| 淮滨县| 海南省| 汝城县| 无棣县| 固阳县| 富顺县| 澳门|