当前位置: 首页 > news >正文

【Java】Java使用Swing实现一个模拟计算器(有源码)

  📝个人主页:哈__

期待您的关注 

今天翻了翻之前写的代码,发现自己之前还写了一个计算器,今天把我之前写的代码分享出来。

 我记得那会儿刚学不会写,写的乱七八糟,但拿来当期末作业还是不错的哈哈。

直接上源码,后上讲解。

一、源码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.function.ToDoubleBiFunction;public class MyCalculator  {private JFrame frame=new JFrame("CSDN--哈__");private String[] keys = {"%","C","CE","Back","1⁄x","X²","√x","÷","7","8","9","X","4","5","6","-","1","2","3","+","+/-","0",".","="};//计算器的功能键保存private JButton [] buttons=new JButton[keys.length];//创建按钮private JTextField resultText=new JTextField("0");//结果保存用于在计算器上显示private double resultNum =0.0000;//用于保存运算的结果private boolean firstDigit=true;//判断是否是第一个输入的数字,或者是运算符后第一个数字private String operate ="=";//记录当前的运算符private boolean opearteValidFlag =true;//判断当前输入是否合法//构造函数public MyCalculator(){frame.setLocation(300,200);frame.setSize(new Dimension(366,439));frame.setVisible(true);frame.setResizable(true);//窗口大小可修改//这里采用awt组件来关闭窗口  事件监听frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosed(WindowEvent e) {System.exit(0);}});}public void init(){//先定义三种颜色 用于背景板的填充  数值为网上查找Color c1=new Color(181,181,181);Color c2=new Color(126,192,238);Color c3=new Color(232,232,232);//计算器功能面板初始化JPanel pText =new JPanel();//用于保存文本域JPanel pKey =new JPanel();//用于保存功能按键//对文本域进行初始化pText.setLayout(new BorderLayout());pText.add(resultText);resultText.setFont(new Font("楷体",Font.BOLD,43));//设置文本框中字体的格式resultText.setHorizontalAlignment(JTextField.RIGHT);//文本框默认右对齐resultText.setEditable(false);//文本域不可编辑resultText.setBorder(null);//设置边框为无resultText.setBackground(c1);//对功能案件进行初始化pKey.setLayout(new GridLayout(6,4,2,2)); //六行四列,相邻两个按钮上下间隔均为两个像素//开始在按键区加入前八个功能键for (int i = 0; i < 8; i++) {buttons[i]=new JButton(keys[i]);pKey.add(buttons[i]);buttons[i].setBackground(c3);buttons[i].setForeground(Color.BLACK);buttons[i].setFont(new Font(Font.SERIF,Font.PLAIN,18));buttons[i].setBorderPainted(false);//设置无边框buttons[i].addActionListener(myActionListener);//添加监听器}for (int i = 8; i < keys.length; i++) {buttons[i]=new JButton(keys[i]);pKey.add(buttons[i]);if((i+1)%4==0)  buttons[i].setBackground(c3);else buttons[i].setBackground(Color.white);buttons[i].setForeground(Color.BLACK);buttons[i].setFont(new Font(Font.SERIF,Font.PLAIN,18));buttons[i].setBorderPainted(false);//设置无边框buttons[i].addActionListener(myActionListener);//添加监听器}//最后将=号的背景色改为蓝色,也就是c2buttons[keys.length-1].setBackground(c2);pKey.setBackground(c1);frame.add(pText,BorderLayout.NORTH);frame.add(pKey);/* pText.setBorder(BorderFactory.createMatteBorder(25,3,1,3,c1));pKey.setBorder(BorderFactory.createMatteBorder(6,3,3,3,c1));*/}public class MyActionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {String key = e.getActionCommand();//对于具有清除删除功能按键的处理(CE C BACK)if(key.equals(keys[1])||key.equals(keys[2])||key.equals(keys[3])){doDeleteKey(key);}//对只需要一个数值的按键处理(% 1/x x² √x  +/-  )else if(key.equals(keys[0])||key.equals(keys[4])||key.equals(keys[5])||key.equals(keys[6])||key.equals(keys[20])){doOperator1(key);}//对需要两个数值的按键的处理(÷ X - += )else if(key.equals(keys[7])||key.equals(keys[11])||key.equals(keys[15])||key.equals(keys[19])||key.equals(keys[23])){doOperator2(key);}//对数字按键进行处理(1 2 3 4 5 6 7 8 9 .)else{doNumberKey(key);}}}private void doDeleteKey(String key){if(key.equals("CE")){resultText.setText("0");}else if(key.equals("C")){resultText.setText("0");resultNum=0.0000;firstDigit=true;opearteValidFlag=true;operate="=";}else{String text=resultText.getText();if(text.length()>1){resultText.setText(text.substring(0,text.length()-1)); //如果内容长度大于1,那么直接删掉最后一个字符}else{//内容长度等于1resultText.setText("0");firstDigit=true;}}}private void doOperator1(String key){//对只需要一个数值的按键处理(% 1/x x² √x  +/-  )operate=key;if(operate.equals("%")){resultNum=getNumFromText()/100;}else if(operate.equals("1⁄x")){if(getNumFromText()==0){//System.out.println("0没有倒数!");resultText.setText("零没有倒数!");opearteValidFlag=false;}else{resultNum=resultNum+1.0/getNumFromText();}}else if(operate.equals("√x")){if(getNumFromText()<0){//System.out.println("负数不能开方!");resultText.setText("负数不能开方!");opearteValidFlag=false;}else{resultNum=resultNum+Math.sqrt(getNumFromText());}}else if(operate.equals("X²")){resultNum=resultNum+getNumFromText()*getNumFromText();}else if(key.equals("+/-")){resultNum=-getNumFromText();firstDigit=true;opearteValidFlag=true;}}//两个数进行运算 ÷ X - + =private void doOperator2(String key){if(operate.equals("÷")){if(getNumFromText()==0){//System.out.println("零不能做除数!");resultText.setText("零不能做除数!");opearteValidFlag=false;}else{resultNum/=getNumFromText();}}else if(operate.equals("X")){resultNum*=getNumFromText();}else if(operate.equals("+")){resultNum+=getNumFromText();}else if(operate.equals("-")){resultNum-=getNumFromText();}else if(operate.equals("=")){resultNum=getNumFromText();}if(opearteValidFlag){long t1=(long)resultNum;double t2=resultNum-t1;if(t2==0){resultText.setText(String.valueOf(t1));}else{resultText.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));}}operate=key;firstDigit=true;opearteValidFlag=true;}private void doNumberKey(String key){//如果是第一个输入的数字或者符号后第一个数字if(firstDigit){if(key.equals(".")) /*resultText.setText(resultText.getText()+".");*/{//上来直接按.  if(resultNum==0&&operate=="=") resultText.setText(resultText.getText()+".");//上来先按了个别的运算符 在按.else{resultText.setText("0.");// resultText.setText("出错!");//opearteValidFlag=false;}}else resultText.setText(key);}else if(key.equals(".")&&resultText.getText().indexOf(".")<0){resultText.setText(resultText.getText()+".");}else if(!key.equals(".")){resultText.setText(resultText.getText()+key);}firstDigit=false;}private double getNumFromText(){double result = 0;try {result = Double.valueOf(resultText.getText()).doubleValue();} catch (NumberFormatException e) {}return result;}MyActionListener myActionListener=new MyActionListener();public static void main(String[] args) {new MyCalculator().init();}
}

二、讲解

1、创建我们所需的变量

计算器上的按键不少,我们都定义在一个keys数组当中,并且初始化一个buttons按钮数组。

除了我们的按钮之外,还有我们的输出显示窗口resultText,输出的结果我们都用resultNum来记录,之后在放到我们的输出窗口上。

其他的都写成注解了。

private JFrame frame=new JFrame("CSDN--哈__");private String[] keys = {"%","C","CE","Back","1⁄x","X²","√x","÷","7","8","9","X","4","5","6","-","1","2","3","+","+/-","0",".","="};//计算器的功能键保存private JButton [] buttons=new JButton[keys.length];//创建按钮private JTextField resultText=new JTextField("0");//结果保存用于在计算器上显示private double resultNum =0.0000;//用于保存运算的结果private boolean firstDigit=true;//判断是否是第一个输入的数字,或者是运算符后第一个数字private String operate ="=";//记录当前的运算符private boolean opearteValidFlag =true;//判断当前输入是否合法

2.面板初始化

面板初始化就是init方法,注释我都写了,这里不在讲了,也没啥重要的,就是美化一下面板。

3.添加按钮事件监听机制

当我们点击计算机上的按钮的时候,计算器要给出反馈,这时就需要我们添加一个事件监听机制了。注释写好了,当我们点击不同的按钮的时候要处理不同的功能。

 public class MyActionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {String key = e.getActionCommand();//对于具有清除删除功能按键的处理(CE C BACK)if(key.equals(keys[1])||key.equals(keys[2])||key.equals(keys[3])){doDeleteKey(key);}//对只需要一个数值的按键处理(% 1/x x² √x  +/-  )else if(key.equals(keys[0])||key.equals(keys[4])||key.equals(keys[5])||key.equals(keys[6])||key.equals(keys[20])){doOperator1(key);}//对需要两个数值的按键的处理(÷ X - += )else if(key.equals(keys[7])||key.equals(keys[11])||key.equals(keys[15])||key.equals(keys[19])||key.equals(keys[23])){doOperator2(key);}//对数字按键进行处理(1 2 3 4 5 6 7 8 9 .)else{doNumberKey(key);}}}

4.处理对于具有清除删除功能按键的处理(CE C BACK)

计算器上有个清空按键C大家都用过吧,点了这个C之后我们所有的输入都会被初始化。倘若点了退格键那我们就把面板上的文字域删掉一个符号。比如我们输入的是111,点了退格之后就是11,当然你会想这只是文字域的变化,那我们保存的要计算的值为什么不变?别着急,真正开始计算是在我们点击了加减乘除这一类的符号的时候才会从面板读取值的。

 private void doDeleteKey(String key){if(key.equals("CE")){resultText.setText("0");}else if(key.equals("C")){resultText.setText("0");resultNum=0.0000;firstDigit=true;opearteValidFlag=true;operate="=";}else{String text=resultText.getText();if(text.length()>1){resultText.setText(text.substring(0,text.length()-1)); //如果内容长度大于1,那么直接删掉最后一个字符}else{//内容长度等于1resultText.setText("0");firstDigit=true;}}}

5.两个数进行运算加减乘除

上来先判断你当前的的符号是什么,并且也进行了一些错误情况的判断,如除数不能为0什么的。

下边你就能看到我们的resultNum被使用了。最后来个操作是否合法判断,如果合法并且输出结果最后是0那我们直接就把0输出到面板上,但是倘若我们的输出结果有精度差,那我们就得自己将0放到面板上了。

注:我使用的浮点数计算并不是BigDecimal,所以存在精度差。

private void doOperator2(String key){if(operate.equals("÷")){if(getNumFromText()==0){//System.out.println("零不能做除数!");resultText.setText("零不能做除数!");opearteValidFlag=false;}else{resultNum/=getNumFromText();}}else if(operate.equals("X")){resultNum*=getNumFromText();}else if(operate.equals("+")){resultNum+=getNumFromText();}else if(operate.equals("-")){resultNum-=getNumFromText();}else if(operate.equals("=")){resultNum=getNumFromText();}if(opearteValidFlag){long t1=(long)resultNum;double t2=resultNum-t1;if(t2==0){resultText.setText(String.valueOf(t1));}else{resultText.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));}}operate=key;firstDigit=true;opearteValidFlag=true;}

 剩下的大家自己研究吧。

相关文章:

【Java】Java使用Swing实现一个模拟计算器(有源码)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 今天翻了翻之前写的代码&#xff0c;发现自己之前还写了一个计算器&#xff0c;今天把我之前写的代码分享出来。 我记得那会儿刚学不会写&#xff0c;写的乱七八糟&#xff0c;但拿来当期末作业还是不错的哈哈。 直接上…...

MC9S12DJ64微控制器

这份文件是关于Freescale的MC9S12DJ64微控制器的用户指南&#xff0c;包含了关于该设备的详细信息和使用说明。以下是核心内容的整理&#xff1a; 产品信息: 产品信息详细描述如下&#xff1a; 1. **产品名称**:- MC9S12DJ64微控制器单元&#xff08;MCU&#xff09;2. **核心…...

小程序打开空白的问题处理

小程序打开是空白的&#xff0c;如下&#xff1a; 这个问题都是请求域名的问题&#xff1a; 一、检查服务器域名配置了 https没有&#xff0c;如果没有&#xff0c;解决办法是申请个ssl证书&#xff0c;具体看这里 https://doc.crmeb.com/mer/mer2/4257 二、完成第一步后&#…...

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version&#xff1a;2023-05-15&#xff0c;就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home&#xff0c;点击更多服务&#xff1a; 我们点击Azure OpenAI&#…...

【JVM性能调优】- GC调优实操思路

1、GC调优实操思路 前面几点所提及的都是GC调优的一些方法论以及衡量指标&#xff0c;但在真正需要处理GC调优时&#xff0c;上面几点只能给你提供辅导&#xff0c;并不能建立完善的调优思路&#xff0c;因此&#xff0c;接下来再一同论述GC调优的具体实操思想。 GC调优时&…...

四川教育装备行业协会考察团走访云轴科技ZStack共话技术创新应用

近日&#xff0c;四川省教育装备行业协会高等教育技术专业委员会组织了一次深入的考察活动&#xff0c;旨在加强与其他省市高校及企业之间的交流与合作&#xff0c;学习借鉴先进的教育装备与管理经验&#xff0c;以提升本省的高等教育技术水平。考察团一行先后走访了武汉理工大…...

KIVY 学习1

环境 python 3.6 3.7 对应Kivy 1.11.1版本各依赖 python -m pip install docutils pygments pypiwin32 kivy_deps.sdl20.1.22 kivy_deps.glew0.1.12 这是一个用于安装Python包的命令&#xff0c;它会安装一些特定的包。具体来说&#xff0c;这个命令会安装以下包&#xff1a; …...

在Go语言中使用select和channel来期待确定性行为

Go开发人员在使用channel时常犯的一个错误是,对select在多个channel中的行为方式做出错误的假设。错误的假设可能会导致难以识别和重现的细微错误。假设我们要实现一个需要从两个channel接收消息的goroutine: 我们可能会决定像下面这样处理优先级: for {select {case v := &…...

【MATLAB源码-第19期】matlab基于导频的OFDM系统瑞利信道rayleigh的信道估计仿真,输出估计与未估计误码率对比图。

1、算法描述 正交频分复用&#xff08;英语&#xff1a;Orthogonal frequency-division multiplexing, OFDM&#xff09;有时又称为分离复频调制技术&#xff08;英语&#xff1a;discrete multitone modulation, DMT&#xff09;&#xff0c;可以视为多载波传输的一个特例&am…...

坚持十天做完Python入门编程100题第三天加班

坚持十天做完Python入门编程100题第三天加班 第24题 扫描文件列表第25题 如何将字典转换成JSON并写入json文件&#xff1f;第26题 JSON转换成字典 第24题 扫描文件列表 如何扫描当前目录下的文件列表&#xff1f;解析&#xff1a;可以使用python内置的glob模块&#xff0c;用法…...

MSOLSpray:一款针对微软在线账号(AzureO365)的密码喷射与安全测试工具

关于MSOLSpray MSOLSpray是一款针对微软在线账号&#xff08;Azure/O365&#xff09;的密码喷射与安全测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以直接对目标账户执行安全检测。支持检测的内容包括目标账号凭证是否有效、账号是否启用了MFA、租户账号是…...

uos安装lxml避坑记录

环境&#xff1a;紫光电脑uos系统 python&#xff1a;系统自带3.7.3 条件&#xff1a;已打开开发者模式&#xff0c;可以自行安装应用商店之外的软件 一、pip3 install lxml4.8.0可以正正常下载&#xff0c;但出现如下错误 另&#xff1a;为什么是4.8.0&#xff1f;因为这个…...

518. 零钱兑换 II(力扣LeetCode)

文章目录 518. 零钱兑换 II题目描述动态规划一维数组为什么不能交换两个for循环的顺序&#xff1f; 二维数组 518. 零钱兑换 II 题目描述 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数…...

01串的熵(蓝桥杯)

文章目录 01串的熵问题描述答案&#xff1a;11027421题意解释暴力枚举 01串的熵 问题描述 对于一个长度为n的01串 S x 1 x 2 x 3 x_{1}x_{2}x_{3} x1​x2​x3​… x n x_{n} xn​&#xff0c;香农信息熵的定义为 H(S) − ∑ 1 n p ( x i ) l o g 2 ( p ( x i ) ) -\sum _{1…...

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型&#xff0c;包括整型&#xff08;如i32、u32&#xff09;、浮点型&#xff08;如f32、f64&#xff09;、布尔类型&#xff08;bool&#xff09;和字符类型&#xff08;char&#xff09;。此外&#xff0c;Rust还提供了原生数组、元组…...

【Java SE】10 String类

目录 1. String类的重要性 2.常用方法 2.1字符串构造 2.2 String对象的比较 2.3字符串查找 2.4转化 2.5字符串替换 2.6字符串拆分 2.7字符串截取 2.8其他操作方法 2.9字符串的不可变性 2.10字符串修改 3. StringBuffer和StringBuilder 3.1StringBuilder的介绍 4.…...

web蓝桥杯真题:新鲜的蔬菜

代码&#xff1a; .box {display: flex; } #box1 {align-items: center;justify-content: center; }#box2 {justify-content: space-between; } #box2 .item:nth-child(2) {align-self: end; }#box3 {justify-content: space-between; } #box3 .item:nth-child(2) {align-self…...

超声波清洗机能洗哪些东西?洗眼镜超声波清洗机推荐

在现代生活中&#xff0c;人们对清洁卫生的要求越来越高&#xff0c;尤其是对一些细小物件的清洁。眼镜作为我们日常生活中不可或缺的物品&#xff0c;清洁保养更是至关重要。传统的清洗方式可能无法完全清洁眼镜表面的细菌和污垢&#xff0c;于是超声波清洗机成为了很多人的选…...

[C++][算法基础]走迷宫(BFS)

给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0 或 1&#xff0c;其中 0 表示可以走的路&#xff0c;1 表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1)(1,1) 处&#xff0c;已知该人每次可以向上、下、左、右任意一个方…...

C语言字符串左旋

一、前言 这个题目的完整题目是这样子的。 二、我们实现这个编程的思路 2.1暴力破解思想 假如有一个数组里面的字符串为”abcdef“&#xff0c;我们这时候就这样先将字符”a“移到最后再将其余的字符前移。 2.2三步移动法 同样我们还是假设一个数组里面存的是字符串”abcd…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...