用Swing开发计算器应选用JFrame+JPanel+JButton组合,事件处理需抽象为appendDigit、setOperator等方法,显示与计算分离,布局采用BorderLayout嵌套GridLayout,严格处理连续运算符和除零异常。

用Swing写计算器界面,别碰JavaFX
Swing 是 Java 标准库中稳定、跨平台、无需额外依赖的 GUI 方案;JavaFX 虽新但默认不打包进 JRE 11+,部署时容易因 ClassNotFoundException: javafx.application.Application 直接崩溃。新手项目优先选 JFrame + JPanel + JButton 组合。
按钮事件必须用 ActionListener,别用 Lambda 写死逻辑
计算器核心是响应数字键和运算符键,但直接在 addActionListener(e -> { ... }) 里写完整计算逻辑会导致代码不可维护、无法复用、难以测试。正确做法是把按键行为抽象为动作类型:
-
"0"到"9":调用appendDigit(int) -
"+"、"-"、"*"、"/":调用setOperator(String) -
"=":调用calculate() -
"C":调用clear()
这样后续改功能(比如加小数点或括号)只需增方法,不动事件绑定。
字符串拼接显示 vs 双精度浮点运算 —— 显示和计算必须分离
用户看到的是字符串(如 "12+34*5"),但真正计算要用 double 和操作符优先级。常见错误是直接对显示文本做 Double.parseDouble(),遇到 "1+2*3" 就算错。建议:
立即学习“Java免费学习笔记(深入)”;
- 显示区域用
JTextField,只负责呈现字符串,禁止直接参与运算 - 内部维护两个状态:
currentNumber(当前输入数字)、pendingOperator(待执行运算符)、result(上一次结果) - 每次按
=时,才基于状态做实际运算,再更新显示
避免用 ScriptEngine 解析表达式——它慢、不安全、抛异常不明确,纯属炫技误事。
布局用 GridLayout + BorderLayout 足够,别折腾 GroupLayout 或 MigLayout
计算器是典型网格结构:顶部显示区 + 下方 4×4 按钮阵列。用 BorderLayout 把 JTextField 放 BorderLayout.NORTH,按钮面板放 BorderLayout.CENTER;按钮面板自身设为 new GridLayout(4, 4, 5, 5)(4 行 4 列,间隔 5 像素)。硬编码行列数比动态计算更可控,也符合计算器固定键位的事实。
字体大小、按钮边距这些细节,靠 setFont() 和 setMargin(new Insets(10, 15, 10, 15)) 调整即可,不用引入外部 UI 库。
最易被忽略的是运算符连续输入的处理,比如连按 +、-、*,应覆盖前一个运算符而非堆叠;还有除零时得捕获 ArithmeticException 并清空显示为 "Error",而不是让程序崩掉。这些边界不是锦上添花,是计算器能用和不能用的分水岭。











