Java Swing实现计算器
·
Java Swing 计算器实现详细讲解文档
目录
项目概述
本项目实现了一个功能完整的桌面计算器应用程序,使用Java Swing GUI框架开发。该计算器具备基础四则运算、科学计算功能、键盘支持等特性,展现了Java桌面应用开发的核心技术。
主要特性
- ✅ 基础四则运算(+、-、*、/)
- ✅ 科学计算功能(平方根、平方、倒数、百分比)
- ✅ 完整的键盘支持
- ✅ 清除功能(全部清除、清除当前输入)
- ✅ 退格功能
- ✅ 正负号切换
- ✅ 高精度数值计算
- ✅ 错误处理机制
技术架构
技术栈
- Java Swing: GUI框架
- BigDecimal: 高精度数值计算
- 事件驱动编程: 用户交互处理
- MVC模式: 界面与逻辑分离
架构图
┌─────────────────────────────────────┐
│ Calculator │
├─────────────────────────────────────┤
│ - JFrame (主窗口) │
│ - JTextField (显示屏) │
│ - JButton[] (按钮组) │
│ - 事件监听器 │
├─────────────────────────────────────┤
│ 核心状态变量: │
│ - currentValue (当前值) │
│ - pendingValue (待运算值) │
│ - pendingOperator (待执行操作符) │
│ - shouldResetDisplay (显示重置标志) │
└─────────────────────────────────────┘
核心类设计
Calculator类结构
class Calculator extends JFrame {
// 界面组件
private final JTextField displayField;
// 计算状态
private BigDecimal currentValue;
private BigDecimal pendingValue;
private String pendingOperator;
private boolean shouldResetDisplay;
// 内部类
private class ButtonClickListener implements ActionListener
// 核心方法
public Calculator() // 构造函数
private void addKeyBindings() // 键盘绑定
private void appendDigit() // 数字输入
private void setOperator() // 操作符设置
private BigDecimal compute() // 数学运算
// ... 其他方法
}
界面设计
布局结构
使用BorderLayout作为主布局管理器:
setLayout(new BorderLayout(8, 8));
界面组件层次
Calculator (JFrame)
├── North: displayField (JTextField) - 显示屏
└── Center: buttonPanel (JPanel) - 按钮面板
└── GridLayout(6, 4, 8, 8) - 6行4列网格布局
└── 24个按钮
按钮布局设计
┌─────┬─────┬─────┬─────┐
│ C │ CE │ ⌫ │ / │
├─────┼─────┼─────┼─────┤
│ 7 │ 8 │ 9 │ * │
├─────┼─────┼─────┼─────┤
│ 4 │ 5 │ 6 │ - │
├─────┼─────┼─────┼─────┤
│ 1 │ 2 │ 3 │ + │
├─────┼─────┼─────┼─────┤
│ +/- │ 0 │ . │ = │
├─────┼─────┼─────┼─────┤
│ 1/x │ % │ x^2 │ √ │
└─────┴─────┴─────┴─────┘
界面样式配置
// 显示屏样式
displayField.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 28));
displayField.setBackground(Color.WHITE);
displayField.setBorder(BorderFactory.createEmptyBorder(16, 12, 16, 12));
// 按钮样式
button.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20));
事件处理机制
事件处理架构
采用事件驱动编程模式,通过监听器处理用户交互:
// 鼠标点击事件
button.addActionListener(new ButtonClickListener());
// 键盘事件
displayField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) { ... }
@Override
public void keyPressed(KeyEvent e) { ... }
});
事件处理流程
用户操作 → 事件触发 → 监听器捕获 → 业务逻辑处理 → 界面更新
具体事件映射
| 用户操作 | 事件类型 | 处理方法 |
|---|---|---|
| 点击数字按钮 | ActionEvent | appendDigit() |
| 点击运算符 | ActionEvent | setOperator() |
| 按数字键 | KeyEvent | appendDigit() |
| 按退格键 | KeyEvent | backspace() |
| 按等号键 | KeyEvent | evaluate() |
数学运算实现
高精度计算
使用BigDecimal类确保计算精度:
private static final MathContext MC = new MathContext(16, RoundingMode.HALF_UP);
运算方法实现
private BigDecimal compute(BigDecimal a, BigDecimal b, String op) {
switch (op) {
case "+": return a.add(b, MC);
case "-": return a.subtract(b, MC);
case "*": return a.multiply(b, MC);
case "/":
if (b.compareTo(BigDecimal.ZERO) == 0) {
showError("除数不能为0");
return a;
}
return a.divide(b, 12, RoundingMode.HALF_UP);
}
}
状态管理
计算器维护四个关键状态:
- currentValue: 当前累积值
- pendingValue: 待参与运算的值
- pendingOperator: 待执行的操作符
- shouldResetDisplay: 显示重置标志
状态转换图
初始状态 → 输入数字 → 设置操作符 → 输入数字 → 计算结果 → 显示结果
↑ ↓
←←←←←←←←←←←←← 清除操作 ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
高级功能
1. 键盘支持
private void addKeyBindings() {
displayField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
if (Character.isDigit(ch)) {
appendDigit(String.valueOf(ch));
} else if (ch == '.') {
appendDot();
}
// ... 其他键盘映射
}
});
}
键盘映射表
| 按键 | 功能 |
|---|---|
| 0-9 | 输入数字 |
| . | 小数点 |
| +、-、*、/ | 运算符 |
| =、Enter | 计算结果 |
| Backspace | 退格 |
| Delete | 清除当前输入 |
| Escape | 全部清除 |
2. 科学计算功能
// 平方根
private void sqrt() {
BigDecimal value = getDisplayValue();
if (value.compareTo(BigDecimal.ZERO) < 0) {
showError("负数没有实数平方根");
return;
}
double d = Math.sqrt(value.doubleValue());
BigDecimal result = new BigDecimal(d, MC);
displayField.setText(trimZeros(result));
}
// 倒数
private void reciprocal() {
BigDecimal value = getDisplayValue();
if (value.compareTo(BigDecimal.ZERO) == 0) {
showError("除数不能为0");
return;
}
BigDecimal result = BigDecimal.ONE.divide(value, 12, RoundingMode.HALF_UP);
displayField.setText(trimZeros(result));
}
3. 错误处理机制
private void showError(String message) {
JOptionPane.showMessageDialog(this, message, "错误", JOptionPane.ERROR_MESSAGE);
}
常见错误处理场景:
- 除零错误
- 负数开方
- 数值溢出
- 无效输入
代码详解
1. 构造函数详解
public Calculator() {
super("计算器"); // 设置窗口标题
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭行为
setSize(360, 520); // 窗口大小
setLocationRelativeTo(null); // 居中显示
setLayout(new BorderLayout(8, 8)); // 布局管理器
// 初始化显示屏
initDisplayField();
// 初始化按钮面板
initButtonPanel();
// 添加键盘支持
addKeyBindings();
}
2. 数字输入逻辑
private void appendDigit(String digit) {
String text = displayField.getText();
if (shouldResetDisplay || "0".equals(text)) {
text = digit; // 重置显示
shouldResetDisplay = false;
} else {
text = text + digit; // 追加数字
}
displayField.setText(text);
}
关键点:
shouldResetDisplay标志控制是否重置显示- 当前显示为"0"时,直接替换为新数字
3. 运算符处理逻辑
private void setOperator(String operator) {
BigDecimal value = getDisplayValue();
if (pendingOperator == null) {
currentValue = value; // 第一个操作数
} else {
// 连续运算:先计算再设置新运算符
currentValue = compute(currentValue, value, pendingOperator);
displayField.setText(trimZeros(currentValue));
}
pendingOperator = operator;
shouldResetDisplay = true; // 准备接收新数字
}
关键点:
- 支持连续运算(如:2 + 3 * 4)
- 设置运算符后标记需要重置显示
4. 计算结果逻辑
private void evaluate() {
if (pendingOperator == null) {
return; // 没有待执行的运算
}
BigDecimal value = getDisplayValue();
pendingValue = value;
BigDecimal result = compute(currentValue, pendingValue, pendingOperator);
displayField.setText(trimZeros(result));
currentValue = result; // 结果成为新的当前值
pendingOperator = null; // 清除待执行运算符
shouldResetDisplay = true; // 准备接收新输入
}
5. 数值格式化
private String trimZeros(BigDecimal value) {
String s = value.stripTrailingZeros().toPlainString();
if (s.equals("-0")) {
s = "0"; // 处理负零情况
}
return s;
}
运行与测试
编译运行
# 编译
javac -d out/production src/com/company/Main.java
# 运行
java -cp out/production com.company.Calculator
测试用例
基础运算测试
- 加法测试: 123 + 456 = 579
- 减法测试: 1000 - 234 = 766
- 乘法测试: 12 * 34 = 408
- 除法测试: 100 / 4 = 25
科学计算测试
- 平方根: √16 = 4
- 平方: 5² = 25
- 倒数: 1/4 = 0.25
- 百分比: 50% = 0.5
边界情况测试
- 除零: 10 / 0 → 显示错误
- 负数开方: √(-4) → 显示错误
- 连续运算: 2 + 3 * 4 = 20
- 小数运算: 0.1 + 0.2 = 0.3
键盘功能测试
- 数字键输入
- 运算符键输入
- 退格键功能
- 回车键计算结果
- ESC键清除
扩展建议
1. 功能扩展
- 历史记录: 保存计算历史
- 内存功能: M+、M-、MR、MC
- 更多科学函数: 三角函数、对数等
- 进制转换: 二进制、八进制、十六进制
- 单位转换: 长度、重量、温度等
2. 界面优化
- 主题切换: 深色/浅色主题
- 自定义颜色: 用户自定义界面颜色
- 动画效果: 按钮点击动画
- 声音反馈: 按键音效
3. 代码优化
- MVC重构: 分离模型、视图、控制器
- 配置文件: 外部配置文件管理
- 日志系统: 添加日志记录
- 单元测试: 完善测试用例
4. 性能优化
- 延迟加载: 按需加载功能模块
- 内存优化: 减少对象创建
- 响应优化: 异步处理复杂计算
总结
本Java Swing计算器项目展现了以下核心技术:
- Swing GUI编程: 窗口、布局、组件使用
- 事件驱动编程: 监听器模式的应用
- 高精度数值计算: BigDecimal的使用
- 状态管理: 复杂状态的控制
- 错误处理: 异常情况的处理
- 用户体验: 键盘支持、错误提示等
通过这个项目,可以深入理解Java桌面应用开发的核心概念和最佳实践。代码结构清晰,功能完整,是学习Java Swing开发的优秀示例。
文档版本: 1.0
创建日期: 2024年
适用Java版本: JDK 8+
源码获取地址: Java Swing实现计算器
更多推荐

所有评论(0)