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

基于 Java Swing 实现的简单科学计算器

> Hello,大家好!我是玖小鼎。  
> 本次给大家分享的是一个基于 Java Swing 实现的简单科学计算器。  
> 这款科学计算器的界面设计简洁美观,代码简洁明了,注释清晰且齐全  
> 非常适用于 Java 初学者熟悉循环、递归、数学运算、 以及 Java Swing 的布局和事件机制。  
> 在文章末尾可以获取到免费源码,欢迎大家下载。

一、运行演示

- 使用了 **5×5 的网格布局** 来排列,程序运行界面如下图所示:
  > 包括`基本运算符`、`科学运算符`、`数字`、`归零`、`等号`等按钮。

- 上方的文本框一共有两行:
  > 第一行用于显示计算过程  
  > 第二行用于显示正在输入的数字或计算结果

- 支持较复杂的运算,例如下图中演示的运算:

二、运行环境

配置项框架或软件名称版本要求
javaJDK1.8+
IDEIdea/Eclipse

> 说明:java 的老版本已经停止维护,推荐使用 `java 17` 或更新的版本。

三、功能列表

功能描述
基本运算`加`/`减`/`乘`/`除`/`取余`
扩展功能负数、小数、连续输入、运算过程、归零
三角函数`正弦`/`余弦`/`正切
其它函数平方根`/`幂函数`
特殊符号n

> 未实现的功能:连续输入时的计算顺序处理,括号的处理,其它数学函数,感兴趣的小伙伴可以自行实现。

四、代码实现


- 定义全局变量:

 // 用于显示计算表达式和结果的文本区域private final JTextArea textArea;// 存储计算结果的变量private double result = 0;// 存储当前操作符的变量private String operator = "";// 标志是否完成一次计算,用于判断是否可以开始新的输入private boolean calculating = true;

- 在构造函数中初始化一个 Swing 窗口:

public Calculator() {setTitle("智能牌科学计算器"); // 设置窗口标题setIconImage(new ImageIcon("./src/calculator/logo.png").getImage()); // 设置窗口图标setSize(350, 350); // 设置窗口大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作// 初始化文本区域,用于显示计算表达式和结果textArea = new JTextArea("\n0", 2, 20);textArea.setEditable(false); // 设置文本区域不可编辑textArea.setFont(new Font("黑体", Font.PLAIN, 24)); // 设置字体add(textArea, BorderLayout.NORTH); // 将文本区域添加到窗口// 初始化按钮面板JPanel buttonPanel = getjPanel();add(buttonPanel, BorderLayout.CENTER); // 将按钮面板添加到窗口的中心}

- 初始化按钮面板,设置为 5×5 的网格布局,并初始化按钮标签数组,为按钮设置监听事件:

private JPanel getjPanel() {JPanel buttonPanel = new JPanel(); // 创建一个新的面板buttonPanel.setLayout(new GridLayout(5, 5)); // 设置面板布局为 5 行 5 列的网格布局// 定义计算器的按钮标签数组String[] buttons = {"sin", "cos", "tan", "log", "AC","7", "8", "9", "+", "^","4", "5", "6", "-", "%","1", "2", "3", "×", "√","0", ".", "=", "÷", "π"};// 遍历按钮标签数组,创建并初始化按钮for (String label : buttons) {JButton button = new JButton(label);button.setFont(new Font("黑体", Font.PLAIN, 20)); // 设置按钮字体button.addActionListener(e -> click(label)); // 设置按钮点击事件监听器buttonPanel.add(button); // 将按钮添加到面板}return buttonPanel; // 返回初始化完成的面板}

- 下面是点击事件的实现方法,可以根据自己的需求来补充完整:

private void click(String label) {// 如果点击的是数字或小数点按钮if ('0' <= label.charAt(0) && label.charAt(0) <= '9' || label.equals(".") || label.equals("π")) {String[] lines = textArea.getText().split("\n");// TODO 针对数字点击事件的处理} else if (label.equals("AC")) {// 如果点击的是清除按钮,清空文本区域textArea.setText("\n0");result = 0;} else {// TODO 针对运算符点击事件的处理}}

- 下面是针对不同的运算符点击事件的处理方法,同样可以根据自己的需求来调整:

private void calculate(String label) {String[] lines = textArea.getText().split("\n");double x;// 如果当前输入包含"("或"^",则将结果赋给x,否则将当前输入转换为double类型if (lines[1].contains("(") || lines[1].contains("^")) {x = result;} else {x = Double.parseDouble(lines[1]);}// 根据操作符执行相应的计算操作String text = lines[0];if (label.equals("sin")) {getResultByOperator(Math.sin(x));text += "\nsin(" + lines[1] + ")";} else if (label.equals("log")) {// TODO 同类型的实现方法不再赘述,参考上面的sin即可} else {// 如果没有之前的操作符result = x;text += lines[1] + label + "\n";if (label.equals("=")) {// 这里主要是去除小数点后多余的0if (result % 1 == 0) {text += (int) result;} else {text += result;}}}textArea.setText(text); // 更新文本区域显示计算结果}

- 下面是基本运算符的实现方法,同样可以根据自己的需求来调整:

 private void getResultByOperator(Double x) {switch (operator) {case "+":result += x;break;case "^":result = Math.pow(result, x);break;// TODO 同类型的实现方法不再赘述,参考上述代码即可default:result = x;break;}// 单次运算完毕,重置计算状态operator = "";}

感谢支持

- 以上就是本次推荐的内容,感谢看到这里的你们,如果觉得我的文章对你有帮助,记得点个关注哦,这对我很重要,你的鼓励是我最大的动力。 获取源码编号:对话框输入 js001


http://www.mrgr.cn/news/61871.html

相关文章:

  • 隨筆 20241024 Kafka中的ISR列表:分区副本的族谱
  • 深入理解Redis的四种模式
  • 在IDEA中运行Mybatis后发现取出的password值为null
  • 《自动驾驶技术的深度思考:安全与伦理的挑战》
  • pdf转为txt文本格式并使用base64加密输出数据
  • 为什么使用Node.js爬虫更优
  • 使用 async/await 时未捕获异常的问题及解决方案
  • 【C++】结构体、enum、union回顾
  • 全面解析:轻松掌握多模态技术精髓
  • YOLOv11改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含C2PSA二次创新)
  • 【Linux】环境ChatGLM-4-9B 模型部署
  • 消息队列-Rabbitmq(消息发送,消息接收)
  • 什么情况下会导致 RCU CPU Stall 警告?
  • 平价开放式耳机品牌推荐有哪些?五大性价比开放式耳机推荐!
  • 代码随想录算法训练营第十五天|110平衡二叉树、257二叉树的所有路径 、404左叶子之和、222完全二叉树的节点个数
  • 收藏 | 推荐15个数据可视化图表绘制网站
  • Windows on ARM编译python的sherpa-onnx库
  • 网络准入控制
  • 直播推流和拉流--系统篇
  • 【机器学习(二十二)】零代码开发之LightGBM算法-Sentosa_DSML社区版
  • ssm014基于JSP的乡镇自来水收费系统+jsp(论文+源码)_kaic
  • 需求挖掘时,深入访谈5大技巧!
  • 【话题】Midjourney与未来设计:AI绘画工具能否取代人类创造力?
  • Nature子刊丨可再生能源对电力系统天气脆弱性的影响
  • Java面试经典 150 题.P27. 移除元素(002)
  • 【C++】C++预编译头文件、基准测试benchmark