Java初学者项目实战:实现一个基础的计算器小游戏
发布时间 - 2026-01-11 00:00:00 点击率:次按钮无响应的核心原因是事件监听器未正确绑定或 actionPerformed 方法位置错误,且未在 SwingUtilities.invokeLater 中初始化界面;小数点重复输入是因缺少当前数字的小数点状态判断;图标不显示是因资源路径未用 getClass().getResource() 加载。
Java中用Swing写计算器界面,为什么按钮点击没反应?
核心问题通常是事件监听器没正确绑定,或者把 actionPerformed 方法写在了错误位置(比如没实现 ActionListener 接口,或忘了调用 button.addActionListener(this))。Swing 是单线程模型,所有 UI 更新必须在事件调度线程(EDT)中进行,但初学者常直接在 main 方法里 new 对象后就调用 setVisible(true),没用 SwingUtilities.invokeLater 包裹——这会导致部分系统下界面卡死或响应异常。
- 确保类声明 implements
ActionListener - 每个按钮都要显式调用
addActionListener(this)(不能只对一个按钮加) -
main方法里初始化窗口必须包在SwingUtilities.invokeLater中 - 避免在
actionPerformed里直接操作非 final 的局部变量;如需更新显示,应操作类成员变量displayText或JTextField实例
如何安全处理“+−×÷”和等号的运算逻辑?
初学者容易把所有数字和符号一股脑拼成字符串再用 eval 解析——Java 没内置 eval,硬写解析器又太重。更稳妥的做法是采用「双栈」或「状态机」思路:记录上一个数字、当前运算符、是否等待输入下一个数字。关键不是立刻计算,而是延迟到按 = 或下一个运算符时才结算上一步。
- 用
double currentNumber = 0存当前输入的数,char lastOperator = '+'记上一个操作符,double result = 0存累计结果 - 遇到数字键:用
currentNumber = currentNumber * 10 + digit累加(注意小数点需额外标记) - 遇到
+/−/×/÷:先按lastOperator把currentNumber合并进result,再更新lastOperator和清空currentNumber - 遇到
=:最后执行一次合并,并显示result
为什么输入小数点后连续点多次,界面上显示“1.23...”?
没做小数点防重逻辑。每次点击 . 都无条件拼接,导致字符串出现多个点。正确做法是在当前输入字段中检查是否已存在小数点,且仅当当前数字部分(即上一个运算符之后的内容)还没有小数点时才允许添加。
- 不要依赖
displayText.getText().contains(".")全局判断——它会把历史表达式里的点也计入 - 应在每次新数字开始输入时重置一个布尔标志
hasDecimalPoint = false - 点击数字或小数点时,只检查当前待输入的这个数是否已有小数点(例如用
currentNumberAsString.indexOf('.') == -1) - 一旦触发运算符(如
+),就重置hasDecimalPoint = false,为下个数字做准备
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.matches("\\d")) {
int digit = Integer.parseInt(cmd);
currentNumber = currentNumber * 10 + digit;
updateDisplay(currentNumber + "");
} else if (cmd.equals(".")) {
if (!currentNumberAsString.contains(".")) {
currentNumberAsString += ".";
updateDisplay(currentNumberAsString);
}
} else if (cmd.equals("=")) {
// 执行最终计算...
}
}打包成可运行jar时,图标和窗口标题不显示?
因为资源路径写死了相对路径(如 "images/icon.png"),而 jar 包内资源必须用 getClass().getResource() 加载。另外,JFrame.setIconImage() 要求传入 Image 对象,不能直接传路径字符串。
立即学习“Java免费学习笔记(深入)”;
- 图标资源应放在
src/main/resources/icons/icon.png(Maven 结构)或与 class 同级的resources/目录下 - 加载方式必须是:
ImageIcon icon = new ImageIcon(getClass().getResource("/icons/icon.png")) - 设置图标前要确保
icon.getImage() != null,否则静默失败 - 窗口标题用
frame.setTitle("简易计算器")即可,无需额外资源
实际开发中,最易被忽略的是事件线程安全和小数点状态管理——前者导致偶发 UI 冻结,后者让程序看起来“能输但算不对
”。这两个点不解决,功能看似完整,实则不可靠。
# java
# git
# 栈
# ai
# win
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
清除minerd进程的简单方法
如何在腾讯云服务器上快速搭建个人网站?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
QQ浏览器网页版登录入口 个人中心在线进入
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
新三国志曹操传主线渭水交兵攻略
如何有效防御Web建站篡改攻击?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
EditPlus 正则表达式 实战(3)
iOS中将个别页面强制横屏其他页面竖屏
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
如何挑选优质建站一级代理提升网站排名?
Laravel如何发送系统通知?(Notification渠道示例)
Android滚轮选择时间控件使用详解
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何在万网利用已有域名快速建站?
Laravel怎么在Controller之外的地方验证数据
网页设计与网站制作内容,怎样注册网站?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
iOS正则表达式验证手机号、邮箱、身份证号等
如何在IIS服务器上快速部署高效网站?
Python并发异常传播_错误处理解析【教程】
如何在万网主机上快速搭建网站?
无锡营销型网站制作公司,无锡网选车牌流程?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何快速搭建个人网站并优化SEO?
Bootstrap整体框架之CSS12栅格系统
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
太平洋网站制作公司,网络用语太平洋是什么意思?
如何续费美橙建站之星域名及服务?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
大型企业网站制作流程,做网站需要注册公司吗?
免费网站制作appp,免费制作app哪个平台好?
原生JS实现图片轮播切换效果
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
javascript日期怎么处理_如何格式化输出
js实现点击每个li节点,都弹出其文本值及修改
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
北京网站制作公司哪家好一点,北京租房网站有哪些?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
移动端脚本框架Hammer.js

