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命名规范,添加了详细的注释以增强可读性。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/22187.html