0

0

怎么用Java的Swing库开发一个带界面的计算器_JFrame与事件监听入门

P粉602998670

P粉602998670

发布时间:2026-03-13 07:01:19

|

349人浏览过

|

来源于php中文网

原创

JFrame需在EDT中创建并调用setVisible(true)、setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)和pack();计算器应维护currentInput字符串,用lambda区分按钮输入,结果用BigDecimal或格式化避免浮点误差。

怎么用java的swing库开发一个带界面的计算器_jframe与事件监听入门

怎么让JFrame窗口正常显示出来不闪退

Swing界面启动后立刻消失,通常是因为没调用 setVisible(true),或者主线程退出太快。Swing必须在事件调度线程(EDT)中创建和更新UI,否则可能无响应或崩溃。

  • SwingUtilities.invokeLater() 包裹整个UI初始化逻辑,别直接在main里new JFrame
  • JFrame 必须设置关闭操作:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),否则点X只是隐藏窗口,进程还在后台跑
  • 记得调用 pack()setSize(),否则窗口可能小到看不见;pack() 更推荐,它按组件自然大小自动调整

按钮点击后怎么拿到数字并做加减乘除

计算器核心不是“算”,而是“把用户按的字符串拼成表达式再解析”。别一上来就监听每个按钮去写 a + b,容易漏状态、难扩展。

  • 用一个 String 类型的变量(比如叫 currentInput)存当前输入的完整字符串,每次按钮点击就追加字符(如 "5""+"
  • 等用户点 "=" 时,再用简单方式解析——比如用 ScriptEngineManager(Java自带)执行字符串表达式,或手写一个支持四则运算的小解析器
  • 避免在 ActionListener 里直接改 JTextField.setText() 后又立刻读它——Swing是异步刷新的,有时会读到旧值;统一走 currentInput 这个源数据

为什么监听器里取不到按钮上的文字或老是重复触发

常见错误是给多个按钮绑同一个匿名内部类,但没区分来源;或者用了 getSource() 却忘了强转,结果空指针。

  • 别写 button1.addActionListener(new ActionListener(){...}) 然后复制粘贴到 button2 —— 改用 lambda:button1.addActionListener(e -> handleInput("1"))
  • 如果真要用 getSource(),必须先判断类型:if (e.getSource() instanceof JButton),再转型,否则 Swing 其他事件(比如焦点变化)也可能进这个监听器
  • 按钮默认有“按下-弹起”两个阶段,但 ActionEvent 只在弹起时触发一次,不用额外防抖;但如果用了 MouseListener,就可能重复触发,别混用

计算结果精度出问题,比如0.1 + 0.2 = 0.30000000000000004

这是浮点数二进制表示的固有缺陷,和Swing无关,但用户看到就会觉得计算器坏了。

Tome
Tome

先进的AI智能PPT制作工具

下载

立即学习Java免费学习笔记(深入)”;

  • 显示结果时别直接 Double.toString(result),改用 String.format("%.10g", result)BigDecimal 格式化
  • 更稳妥的做法:所有运算用 BigDecimal,输入数字时就转成 BigDecimal 存起来,中间不经过 double
  • 注意 BigDecimal.valueOf(double) 仍有精度风险,优先用 new BigDecimal("0.1") 字符串构造

真正麻烦的是连续运算(比如 1 + 2 * 3),光靠字符串拼接+eval容易错优先级;如果需求变复杂,就得上表达式解析,而不是硬撑在监听器里if-else。这点很多人一开始没意识到,等加了括号功能才回头重写。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

887

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

462

2024.06.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号