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 的局部变量;如需更新显示,应操作类成员变量 displayTextJTextField 实例

如何安全处理“+−×÷”和等号的运算逻辑?

初学者容易把所有数字和符号一股脑拼成字符串再用 eval 解析——Java 没内置 eval,硬写解析器又太重。更稳妥的做法是采用「双栈」或「状态机」思路:记录上一个数字、当前运算符、是否等待输入下一个数字。关键不是立刻计算,而是延迟到按 = 或下一个运算符时才结算上一步。

  • double currentNumber = 0 存当前输入的数,char lastOperator = '+' 记上一个操作符,double result = 0 存累计结果
  • 遇到数字键:用 currentNumber = currentNumber * 10 + digit 累加(注意小数点需额外标记)
  • 遇到 +//×/÷:先按 lastOperatorcurrentNumber 合并进 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