当前位置: 首页 > 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…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...