文章目录

  • 一、计算器界面
  • 二、已实现功能
  • 三、准备工作和思路搭建
  • 四、代码与注释(已尽力做到条条代码条条注释了)
  • 六、下载
  • 七、写在后面

一、计算器界面

二、已实现功能

  • BackSpace:实现退格键
  • CE:清空文本框
  • C:清空并还原
  • +、-、*、/:加减乘除运算
  • +/-:取相反数
  • 1/x:取倒数
  • %:百分号
  • sqrt:平方根

三、准备工作和思路搭建

  • 界面布置

  • 界面具体步骤

上述表格中:
标号为1的是一个单独的JPanel面板,面板实行边界布局管理器------>这一步标记为①
标号为2的是一个单独的JPanel面板,面板实行网格布局管理器------>这一步标记为②
标号为3的是一个单独的JPanel面板,面板实行网格布局管理器------>这一步标记为③
标号为4的是一个单独的JPanel面板,面板实行网格布局管理器------>这一步标记为④
创建一个新的JPanel面板,将②和③合为一起,实行边界布局管理器,②置为北边,③置为中央------>这一步标记为⑤
此后便剩下①、⑤、④,所以使用JFrame这个大容器自身面板,创建新的边界布局管理器,①置为北边,④置为西边,⑤置为中央

  • 之后实行事件处理
    代码注释很详细了

四、代码与注释(已尽力做到条条代码条条注释了)

package calculator;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;public class Calculator2 extends JFrame implements ActionListener {// 准备好东西// 显示计算机上4行5列区域的按键private String[] Keys = { "7", "8", "9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-", "1/x", "0","+/-", ".", "+", "=" };// 定义5行1列的存储M键的按钮private String[] M = { "", "MC", "MR", "MS", "M+" };// 定义1行3列的命令行按钮private String[] Cmd = { "BackSpace", "CE", "C" };// 定义4行5列键的按钮private JButton[] keys = new JButton[Keys.length];// 定义5行1列M键的按钮private JButton[] m = new JButton[M.length];// 定义1行3列的功能命令按钮private JButton[] cmd = new JButton[Cmd.length];// 计算结果的文本框private JTextField resultText = new JTextField("0");// 第一个数字和运算符后的第一个数字的标识private boolean firstDigit = true;// 当前运算的运算符private String operator = "=";// 操作合法的标识private boolean operatorFlag = true;// 运算的中间结果private double resultMid = 0.0;public Calculator2() {super();init();// 设置计算器的背景颜色this.setBackground(Color.LIGHT_GRAY);this.setTitle("计算器");// 在屏幕中间位置显示计算器this.setLocationRelativeTo(null); // 不许修改计算器的大小,即不可拉伸this.setResizable(false);// 设置可见性this.setVisible(true);//设置默认关闭this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 使计算器中各组件大小合适this.pack();this.setLocationRelativeTo(null); }/** 进行整个计算器的初始化工作 即整个界面的布置*/private void init() {// 创建面板1来放置4行5列,并设置其布局管理器为网格布局,四行5列.且每一个格子的间距为3JPanel KEYS = new JPanel();KEYS.setLayout(new GridLayout(4, 5, 3, 3));// 实行放置,即实例化,并设置前景色for (int i = 0; i < Keys.length; i++) {keys[i] = new JButton(Keys[i]);// 设置按钮背景颜色if (i == 3 || i == 8 || i == 13 || i == 18 || i == 19) {keys[i].setForeground(Color.red);// 这些功能键为红色} else {keys[i].setForeground(Color.blue);// 其余的为红色}KEYS.add(keys[i]);}// 创建面板2用来放置M键,并设置前景色为红色JPanel Mm = new JPanel();Mm.setLayout(new GridLayout(5, 1, 3, 3));for (int i = 0; i < M.length; i++) {m[i] = new JButton(M[i]);m[i].setForeground(Color.red);Mm.add(m[i]);}// 创建面板3用来放置1行3列的命令行按钮按键JPanel CMD = new JPanel();CMD.setLayout(new GridLayout(1, 3, 3, 3));for (int i = 0; i < Cmd.length; i++) {cmd[i] = new JButton(Cmd[i]);cmd[i].setForeground(Color.red);CMD.add(cmd[i]);}// 创建面板4放置文本框,并设置布局管理器为边界布局JPanel text = new JPanel();text.setLayout(new BorderLayout());// 先对文本框进行设置// 1.设置文本框为不可编辑resultText.setEditable(false);// 2.设置背景色为白色resultText.setBackground(Color.white);// 3.设置文本框的内容向右对齐,参数为静态属性resultText.setHorizontalAlignment(JTextField.RIGHT);// 将文本框放置面板中text.add(resultText, "Center");//创建面板5将1行3列命令行功能键和4行5列按键放置一个大的面板中结为一起,采用边界布局,间距为3像素JPanel big = new JPanel();big.setLayout(new BorderLayout(3,3));big.add(CMD,"North");big.add(KEYS,"Center");//进行整体布局//虽然默认JFrame的布局管理器为边界布局,但是要设置其边距为3,故重新new一个this.setLayout(new BorderLayout(3,3));this.add(big,"Center");this.add(Mm,"West");this.add(text,"North");//所有按钮添加事件监听器for(int i=0;i<Keys.length;i++) {keys[i].addActionListener(this);}for(int j=0;j<M.length;j++) {m[j].addActionListener(this);}for(int i=0;i<Cmd.length;i++) {cmd[i].addActionListener(this);}}//进行事件处理,以按钮中的字符串内容为区分切入点@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString content = e.getActionCommand();if(content.equals(Cmd[0])) {//如果用户按下了退格键,执行BackSpace()函数操作BackSpace();firstDigit=true;}else if(content.equals(Cmd[1])) {//如果用户按下了CE键,还原文本框,其余不变resultText.setText("0");firstDigit=true;}else if(content.equals(Cmd[2])) {//如果用户按下了C键,即还原计算器初始状态resultText.setText("0");// 当前运算的运算符operator = "=";// 操作合法的标识firstDigit = true;}else if("0123456789.".indexOf(content)>=0){//从该content内容是否包含在"0123456789."中,从而判断用户按下的是数字或小数点process(content);//按键数字处理的是文本框中的显示数据}else {//运算符处理//前面都不满足时执行这条语句,很巧妙handOperator(content);//当按下的按钮内容是运算符时}}//处理BackSpace键,这是计算器中的退格键,需要判断两个点,如果结果文本款中没有数字时则还原初始化计算器本身状态,如果有内容,则退去最后一个字符public void BackSpace() {String str = resultText.getText();//获取文本框的内容//进行判断内容情况if(str.length()>0) {str = str.substring(0, str.length()-1);//将最后一个字符去掉//去掉最后一个字符后如果新的文本框字符串中没有了字符则初始化计算器if(str.length()==0) {resultText.setText("0");// 当前运算的运算符operator = "=";// 操作合法的标识operatorFlag = true;}else {resultText.setText(str);}} }//process,进行数字和小数点的处理public void process(String s) {if(firstDigit) {//判断是否是键入键盘的第一个数,便于将文本的初始0去掉resultText.setText(s);}else if((s.equals("."))&&(resultText.getText().indexOf("."))<0) {//如果第一个键入的数字是小数点resultText.setText(resultText.getText()+".");}else if(!(s.equals("."))) {//如果键入的不是小数点resultText.setText(resultText.getText()+s);}//此函数的代码执行到这里最后输入之后的数字便不再是第一个数字了。改变标志firstDigit=false;}//处理用户按下的是运算符的操作public void handOperator(String c) {if(operator.equals("/")) {//除法操作的运算符时if(getDoubleNum()==0.0) {//如果分母为0时operatorFlag=false;//操作不合法resultText.setText("分母不能为0");}else {resultMid /= getDoubleNum();//使用的结果赋值给中间值,因为初始默认是‘=’操作时,就把中间值赋值为第一个数字了}}else if(operator.equals("1/x")) {//如果按的是倒数运算符if(getDoubleNum()==0.0) {//如果分母为0时operatorFlag=false;//操作不合法resultText.setText("0没有倒数");}else {resultMid = 1/resultMid;//使用的结果赋值给中间值,因为初始默认是‘=’操作时,就把中间值赋值为第一个数字了}}else if(operator.equals("+")) {//如果是加法操作resultMid += getDoubleNum();}else if(operator.equals("*")) {//乘法resultMid *= getDoubleNum();}else if(operator.equals("sqrt")) {resultMid=Math.sqrt(getDoubleNum());}else if(operator.equals("%")) {//百分号操作resultMid=resultMid/100;}else if (operator.equals("+/-")) {// 正数负数运算resultMid = resultMid * (-1);} else if (operator.equals("=")) {// 赋值运算resultMid = getDoubleNum();}else if(operator.equals("-")) {resultMid -= getDoubleNum();}//判断合法后将结果存储在结果文本框中if (operatorFlag) {// 双精度浮点数的运算long t1;double t2;t1 = (long) resultMid;//转化为long后,其后面的小数点会没有t2 = resultMid - t1;//double-longif (t2 == 0) {//说明此时resultMid是整数resultText.setText(String.valueOf(t1));} else {//double类型resultText.setText(String.valueOf(resultMid));}}//运算符等于用户按下的按钮operator=c;firstDigit = true;operatorFlag = true;}//获取结果框中的数字字符串,并转化为double类型public double getDoubleNum() {try {return Double.valueOf(resultText.getText()).doubleValue();}catch(NumberFormatException e) {return 0;}     }public static void main(String[] args) {new Calculator2();}
}

六、下载

程序已上传至资源,需要的朋友们可点击下载,谢谢支持。
点击下载学习

七、写在后面

上述文章如有出错的地方,欢迎读者朋友们评论指正,谢谢。

JAVA语言实现计算器小项目(与Windows附件自带计算器的标准版功能、界面相仿)相关推荐

  1. C语言学习历程--小项目篇(1)

    C语言学习历程–小项目篇–基于winpcap的UDP数据发送 开发环境介绍 1.操作系统:windows10(基于x64处理器).IDE:vs 2019(微软官网个人免费版).winpcap安装包及开 ...

  2. 矩阵键盘基于51(UcosII)计算器小项目

    矩阵键盘 最近要给学弟学妹(应该没有)培训矩阵键盘,正好写一写我写矩阵键盘的思路,顺便分享一个之前做的基于ucosii的计算器小项目 原理 原理就不介绍了,CSDN有很多分享的,推荐两篇参考一下: 参 ...

  3. java编写家庭收支记录,Java家庭收支记账小项目(java基础)

    Java家庭收支记账小项目(java基础) Java家庭收支记账小项目(java基础) 需求说明: 模拟实现基于文本界面的<家庭记账软件>. 该软件能够记录家庭的收入.支出,并能够打印收支 ...

  4. java 2048游戏_JAVA2048游戏 本课程设计是基于java语言的2048小游戏设计 联合开发网 - pudn.com...

    JAVA2048游戏 所属分类:游戏 开发工具:Java 文件大小:789KB 下载次数:4 上传日期:2020-11-23 10:57:11 上 传 者:滴滴滴大萌 说明:  本课程设计是基于jav ...

  5. Windows Server 2003 SP2 R2 企业版/标准版/32与64位 CD-KEY

    微软发布Windows Server 2003 R2版的目的是希望透过它填补Windows Server 2003 SP1和Longhorn Server之间的产品发布时间间隔.所以Windows S ...

  6. c语言程序 实现简单计算器功能,C语言实现简单计算器小项目

    昨天刚安装上devc++,半夜想着练练C语言吧 于是就看到实验楼有一个计算器的项目 之前做过一次,这次写的主要是思路 首先我们先从原理思考jia,实现简单的计算器就要具备加减乘除这些,看普通的计算器也 ...

  7. c语言实用计算器项目,C语言实现简单计算器小项目

    昨天刚安装上devc++,半夜想着练练C语言吧 于是就看到实验楼有一个计算器的项目 之前做过一次,这次写的主要是思路 首先我们先从原理思考jia,实现简单的计算器就要具备加减乘除这些,看普通的计算器也 ...

  8. 如何保留5个有效数字输出c不4舍5入_10 个C语言课设小项目拿走不谢~

    序言 C 语言是大多数人的编程入门语言,但很多初学者在学习的过程中难免会出现一些迷茫,比如:不知道 C 语言可以开发哪些项目,可以应用在哪些实际的开发中-- 今天小编收集了 10 个 C 语言练手项目 ...

  9. 初学者c语言心里测试小项目

    心里测试小项目 注:程序使用easyx函数库进行图形化编程,需下载并安装easyx库 心里测试 心里测试小项目 一.前言 介绍 参考资源 编译环境 运行效果图 二.头文件 三.主要函数 四.具体代码 ...

最新文章

  1. (导航页)Amazon Lightsail 部署LAMP应用程序(HA)
  2. MapReduce示例——WordCount(统计单词)
  3. VTK:BSP树时序用法实战
  4. 软件开发---全套规范
  5. [dp]最长单调递增子序列LIS
  6. vue 刷新echarts_在vue.js中使用echarts,数据动态刷新
  7. rocketmq新扩容的broker没有tps_揭秘 RocketMQ 新特性以及在金融场景下的实践
  8. L1-006. 连续因子-PAT团体程序设计天梯赛
  9. 11-2-进程控制块
  10. 关于Microsoft Edge主页被360劫持
  11. windows安装python3步骤_windows下python3第三方库安装方法总结
  12. 双击鼠标触发了Ctrl+C事件
  13. 蚁群算法详解(含例程)
  14. 金蝶eas怎么引出凭证_如何引出会计分录序时簿?
  15. 什么是CC攻击,CC攻击的防御方式有哪些
  16. 计算机内存调用优化,Memory Cleaner——简单好用的Windows内存优化工具
  17. 【MySql】mysql之用户管理
  18. pytesseract 测试获取查策网编码字体
  19. 560万Facebook人际关系数据,揭秘家庭职业传承“真相”
  20. H3C   VALN-MSTP-VRRP实验日记

热门文章

  1. ios激活锁_如何检查iOS设备的激活锁状态
  2. JS中的JSON.Stringify 方法详解
  3. 波形记录仪MR6000的实时波形运算功能
  4. Cisco Packet Tracer 思科常用命令
  5. Python 基于GDAL包的一些地理坐标投影转换 包括GDAL的安装以及环境配置设置
  6. Windows端pytorch镜像快速安装【清华源】
  7. 蓝桥杯真题:作物杂交
  8. 批量提取文件名(JPG照片等)
  9. 验证中文名字---正则表达式
  10. 如何面对未来智能化社会