0

0

在Java中如何用Swing实现一个简易计算器_Java图形界面编程实战说明

P粉602998670

P粉602998670

发布时间:2026-02-04 09:36:32

|

314人浏览过

|

来源于php中文网

原创

用JFrame+GridLayout搭计算器最稳妥,因其布局可控、事件响应明确;GridLayout保证4×5按钮网格整齐对齐,代码量少且逻辑直白;需注意行数在前(5行)、列数在后(4列),显示屏用setEditable(false)的JTextField,按钮统一监听,用pack()自适应尺寸。

在java中如何用swing实现一个简易计算器_java图形界面编程实战说明

为什么直接用 JFrame + GridLayout 搭按钮最稳妥

Swing 做计算器,核心是布局可控、事件响应明确。用 BorderLayout绝对定位容易错位,尤其在窗口缩放或不同 DPI 下;GridLayout 能保证 4×5(含显示屏)按钮网格整齐对齐,且代码量最少、逻辑最直白。

实操建议:

  • new GridLayout(5, 4) 创建面板,注意行数在前(5 行:显示屏 + 4 行按钮),列数在后(4 列)
  • 显示屏用 JTextField,设为 setEditable(false),避免键盘误输
  • 所有数字和运算符按钮统一用 addActionListener(this),在 actionPerformed 中用 e.getActionCommand() 区分操作
  • 别忘了调用 pack() 而非 setSize(),让组件自适应尺寸

actionPerformed 里怎么安全处理连续点击和双符号

用户可能连点 +、输入 12+3+5 或误按 ==,硬编码判断容易漏 case。关键是把状态拆成三部分:当前输入值、上一个运算符、是否等待新数字。

常见错误现象:

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

  • 点两次 + 后再输数字,结果变成 0+数字(没保留上次计算中间值)
  • = 后继续输数字,没清空屏幕或重置状态,导致拼接错误表达式

推荐做法:

  • 用三个字段:private double lastValue(上次参与运算的数)、private String pendingOperator(待执行的运算符)、private boolean startNewNumber(标识下一次输入是否覆盖显示)
  • 遇到数字按钮时:若 startNewNumbertrue,清空文本框并设为 false;否则追加字符
  • 遇到运算符按钮时:先尝试执行上一次未完成的计算(如果有 pendingOperator),再更新 pendingOperatorlastValue
  • = 按钮只触发一次计算,之后设 startNewNumber = true,允许输入新数字

为什么不用 Double.parseDouble() 直接转字符串表达式

初学者常想把整个屏幕字符串(如 "12+3*5")丢给 parseDouble,这会抛 NumberFormatException —— 它只能转纯数字字符串,不支持表达式求值。

CopyWeb
CopyWeb

AI网页设计转换工具,可以将屏幕截图、网站URL转换为代码组件

下载

正确路径只有两条:

  • 简单计算器:只支持单步运算(如 12 + 3 =),每次只记一个操作符和两个操作数,用 switch 分支做四则运算
  • 稍进阶:手写简易表达式解析器,用两个(数字栈、运算符栈),按优先级弹出计算(适合练手,但别在作业里硬套 Shunting Yard 算法)

千万别引入 javax.script.ScriptEngine——虽然能跑 "12+3*5",但它启动慢、有安全风险、Swing 主线程阻塞明显,且偏离“理解事件流与状态管理”的教学目标。

字体和监听器泄漏这两个细节最容易被忽略

计算器界面太小字看不清,但直接 setFont(new Font("Arial", 0, 18)) 在 Linux 或 macOS 上可能 fallback 成方块;另外,反复 addActionListener 却不 removeActionListener,会导致旧按钮仍响应事件(尤其在动态重建面板时)。

解决方式很具体:

  • UIManager.put("Label.font", new Font("Dialog", Font.PLAIN, 16)) 统一设置系统级默认字体,比逐个设更可靠
  • 按钮初始化只做一次:在构造函数里创建按钮数组,循环添加监听器,不要在事件处理中重复 add
  • 如果真要动态刷新界面(比如切换主题),先用 button.removeActionListener(this) 清理,再重建

真正卡住人的往往不是算法,而是 startNewNumber 没在该设 true 的时候设,或者字体在高分屏上缩成一条线——这些得运行起来点几遍才看得见。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

563

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

354

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

34

2025.11.30

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

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

1506

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

233

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

107

2025.10.17

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

544

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

425

2024.03.13

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

36

2026.02.03

热门下载

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

精品课程

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

共48课时 | 8.4万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

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

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