上一篇
Java计算器程序代码实现图形界面,包含数字按钮、运算符按钮及结果显示框,通过事件监听处理用户点击,利用条件判断或
switch执行加减乘除等基本运算,并处理异常情况(如除数为零),核心是界面布局与逻辑运算的结合。
Java计算器程序开发指南
实现思路
我将创建一个功能完整的Java计算器程序,包含以下核心功能:

- 基本算术运算(加、减、乘、除)
- 小数运算支持
- 错误处理(如除数为零)
- 用户友好的界面
- 历史记录功能
Java计算器完整代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
public class JavaCalculator extends JFrame implements ActionListener {
// 界面组件
private JTextField displayField;
private JButton[] numberButtons;
private JButton addButton, subButton, mulButton, divButton;
private JButton decButton, equButton, clrButton, delButton;
private JButton negButton, perButton;
private JTextArea historyArea;
// 计算器状态
private double currentValue = 0;
private String currentOperator = "";
private boolean newInput = true;
private boolean calculationPerformed = false;
public JavaCalculator() {
// 设置窗口属性
setTitle("Java科学计算器");
setSize(500, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
setLocationRelativeTo(null);
// 创建显示区域
displayField = new JTextField("0");
displayField.setFont(new Font("Arial", Font.BOLD, 36));
displayField.setHorizontalAlignment(JTextField.RIGHT);
displayField.setEditable(false);
displayField.setBackground(new Color(240, 240, 240));
add(displayField, BorderLayout.NORTH);
// 创建历史记录区域
historyArea = new JTextArea(5, 20);
historyArea.setEditable(false);
historyArea.setFont(new Font("Arial", Font.PLAIN, 14));
JScrollPane historyScroll = new JScrollPane(historyArea);
historyScroll.setBorder(BorderFactory.createTitledBorder("计算历史"));
add(historyScroll, BorderLayout.EAST);
// 创建按钮面板
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(5, 4, 10, 10));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
// 初始化按钮
String[] buttonLabels = {
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+",
"C", "Del", "(-)", "%"
};
numberButtons = new JButton[10];
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].addActionListener(this);
numberButtons[i].setFont(new Font("Arial", Font.BOLD, 18));
numberButtons[i].setBackground(new Color(220, 220, 255));
}
// 创建功能按钮
decButton = new JButton(".");
equButton = new JButton("=");
addButton = new JButton("+");
subButton = new JButton("-");
mulButton = new JButton("*");
divButton = new JButton("/");
clrButton = new JButton("C");
delButton = new JButton("Del");
negButton = new JButton("(-)");
perButton = new JButton("%");
// 添加按钮到面板
JButton[] allButtons = {
numberButtons[7], numberButtons[8], numberButtons[9], divButton,
numberButtons[4], numberButtons[5], numberButtons[6], mulButton,
numberButtons[1], numberButtons[2], numberButtons[3], subButton,
numberButtons[0], decButton, equButton, addButton,
clrButton, delButton, negButton, perButton
};
// 设置按钮样式和监听器
for (JButton button : allButtons) {
button.addActionListener(this);
button.setFont(new Font("Arial", Font.BOLD, 18));
button.setBackground(new Color(200, 230, 255));
button.setFocusPainted(false);
buttonPanel.add(button);
}
// 特殊按钮样式
equButton.setBackground(new Color(100, 200, 100));
clrButton.setBackground(new Color(255, 150, 150));
delButton.setBackground(new Color(255, 200, 100));
add(buttonPanel, BorderLayout.CENTER);
// 添加底部信息
JLabel infoLabel = new JLabel("Java计算器 | 支持基本运算、小数、负数、百分比计算");
infoLabel.setHorizontalAlignment(SwingConstants.CENTER);
infoLabel.setFont(new Font("Arial", Font.PLAIN, 12));
infoLabel.setForeground(Color.GRAY);
add(infoLabel, BorderLayout.SOUTH);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
// 处理数字输入
if (command.matches("[0-9]")) {
handleNumberInput(Integer.parseInt(command));
return;
}
// 处理小数点
if (command.equals(".")) {
handleDecimalPoint();
return;
}
// 处理运算符
if (command.matches("[+\-*/]")) {
handleOperator(command);
return;
}
// 处理等号
if (command.equals("=")) {
performCalculation();
return;
}
// 处理清除
if (command.equals("C")) {
clearCalculator();
return;
}
// 处理删除
if (command.equals("Del")) {
deleteLastCharacter();
return;
}
// 处理正负号
if (command.equals("(-)")) {
toggleSign();
return;
}
// 处理百分比
if (command.equals("%")) {
handlePercentage();
return;
}
}
private void handleNumberInput(int digit) {
if (newInput || calculationPerformed) {
displayField.setText(String.valueOf(digit));
newInput = false;
calculationPerformed = false;
} else {
String currentText = displayField.getText();
if (currentText.equals("0")) {
displayField.setText(String.valueOf(digit));
} else {
displayField.setText(currentText + digit);
}
}
}
private void handleDecimalPoint() {
if (newInput) {
displayField.setText("0.");
newInput = false;
calculationPerformed = false;
} else {
String currentText = displayField.getText();
if (!currentText.contains(".")) {
displayField.setText(currentText + ".");
}
}
}
private void handleOperator(String operator) {
if (!newInput) {
performCalculation();
}
currentOperator = operator;
currentValue = Double.parseDouble(displayField.getText());
newInput = true;
calculationPerformed = false;
}
private void performCalculation() {
if (currentOperator.isEmpty()) return;
double secondOperand = Double.parseDouble(displayField.getText());
double result = 0;
try {
switch (currentOperator) {
case "+":
result = currentValue + secondOperand;
break;
case "-":
result = currentValue - secondOperand;
break;
case "*":
result = currentValue * secondOperand;
break;
case "/":
if (secondOperand == 0) {
throw new ArithmeticException("除零错误");
}
result = currentValue / secondOperand;
break;
}
// 格式化结果
String resultStr;
if (result == (long) result) {
resultStr = String.format("%d", (long) result);
} else {
resultStr = String.format("%.6f", result).replaceAll("0*$", "").replaceAll("\.$", "");
}
// 更新显示
displayField.setText(resultStr);
// 记录历史
String historyEntry = String.format("%.2f %s %.2f = %s",
currentValue, currentOperator, secondOperand, resultStr);
historyArea.append(historyEntry + "n");
// 重置状态
currentValue = result;
calculationPerformed = true;
newInput = true;
} catch (ArithmeticException ex) {
displayField.setText("错误: " + ex.getMessage());
clearCalculator();
}
}
private void clearCalculator() {
displayField.setText("0");
currentValue = 0;
currentOperator = "";
newInput = true;
calculationPerformed = false;
}
private void deleteLastCharacter() {
if (newInput) return;
String currentText = displayField.getText();
if (currentText.length() > 1) {
displayField.setText(currentText.substring(0, currentText.length() - 1));
} else {
displayField.setText("0");
newInput = true;
}
}
private void toggleSign() {
String currentText = displayField.getText();
if (currentText.startsWith("-")) {
displayField.setText(currentText.substring(1));
} else if (!currentText.equals("0")) {
displayField.setText("-" + currentText);
}
}
private void handlePercentage() {
double value = Double.parseDouble(displayField.getText());
double percentage = value / 100.0;
if (currentOperator.equals("+") || currentOperator.equals("-")) {
percentage = currentValue * percentage;
}
// 格式化结果
String resultStr;
if (percentage == (long) percentage) {
resultStr = String.format("%d", (long) percentage);
} else {
resultStr = String.format("%.6f", percentage).replaceAll("0*$", "").replaceAll("\.$", "");
}
displayField.setText(resultStr);
newInput = true;
}
public static void main(String[] args) {
// 使用SwingUtilities确保GUI线程安全
SwingUtilities.invokeLater(() -> {
try {
// 设置系统外观
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
new JavaCalculator();
});
}
}
代码解析
用户界面设计
- 使用Swing创建图形用户界面
- 包含数字按钮(0-9)、运算符按钮(+-*/)、功能按钮(清除、删除、正负号、百分比)
- 显示区域使用大字体,支持长数字显示
- 右侧添加历史记录面板,保存计算历史
核心功能实现
- 基本运算:支持加减乘除四则运算
- 小数处理:正确处理浮点数运算
- 错误处理:检测除数为零等错误情况
- 连续计算:支持连续运算(如1+2+3)
- 特殊功能:
- 清除(C):重置计算器状态
- 删除(Del):删除最后输入的数字
- 正负号((-)):切换当前数字的正负
- 百分比(%):计算百分比值
实现细节
- 使用状态变量跟踪计算器状态(
currentValue,currentOperator,newInput) - 计算结果格式化处理,去除多余的0
- 使用try-catch处理可能的算术异常
- 历史记录功能保存每次计算表达式和结果
使用说明
- 输入第一个数字
- 选择运算符(+-*/)
- 输入第二个数字
- 按”=”查看结果
- 可继续使用运算符进行连续计算
- 使用”C”按钮清除当前计算
- 右侧面板查看计算历史
如何运行此程序
- 将代码保存为
JavaCalculator.java - 使用命令编译:
javac JavaCalculator.java - 运行程序:
java JavaCalculator
学习价值
这个Java计算器程序展示了:
- 面向对象编程思想
- GUI开发技术(Swing)
- 事件处理机制
- 异常处理
- 字符串和数字处理
- 状态管理
通过分析和扩展此代码,可以学习Java核心编程概念和GUI开发技巧。

本程序参考了Oracle官方Java文档和Swing教程中的最佳实践,结合了常见的计算器实现模式,代码遵循Java命名规范,添加了详细的注释以增强可读性。

