Java简易计算器如何实现?

Java计算器程序代码实现图形界面,包含数字按钮、运算符按钮及结果显示框,通过事件监听处理用户点击,利用条件判断或switch执行加减乘除等基本运算,并处理异常情况(如除数为零),核心是界面布局与逻辑运算的结合。

Java计算器程序开发指南

实现思路

我将创建一个功能完整的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处理可能的算术异常
  • 历史记录功能保存每次计算表达式和结果

使用说明

  1. 输入第一个数字
  2. 选择运算符(+-*/)
  3. 输入第二个数字
  4. 按”=”查看结果
  5. 可继续使用运算符进行连续计算
  6. 使用”C”按钮清除当前计算
  7. 右侧面板查看计算历史

如何运行此程序

  1. 将代码保存为JavaCalculator.java
  2. 使用命令编译:javac JavaCalculator.java
  3. 运行程序:java JavaCalculator

学习价值

这个Java计算器程序展示了:

  • 面向对象编程思想
  • GUI开发技术(Swing)
  • 事件处理机制
  • 异常处理
  • 字符串和数字处理
  • 状态管理

通过分析和扩展此代码,可以学习Java核心编程概念和GUI开发技巧。

Java简易计算器如何实现?

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

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/22187.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月13日 07:18
下一篇 2025年6月13日 07:25

相关推荐

  • Java如何高效批导入方法?

    Java中实现批量数据导入主要使用JDBC批处理机制:通过PreparedStatement的addBatch()累积SQL语句,再以executeBatch()一次性执行,结合事务控制(关闭自动提交)可大幅提升数据库写入效率,常用优化包括设置合理批处理大小、分批次提交避免内存溢出。

    2025年6月12日
    100
  • Java日历控件如何添加?

    在Java中添加日历控件常用Swing的JCalendar组件或第三方库如JDatePicker,需先引入对应jar包,创建控件实例后添加到容器(如JPanel),通过事件监听器获取用户选择的日期数据。

    2025年5月30日
    300
  • Java网站服务如何启动?

    启动Java网站服务通常通过命令行或IDE执行包含业务逻辑的WAR或JAR包,依赖JDK环境,常用命令如java -jar yourapp.jar或部署到Tomcat等Servlet容器(如将WAR放入webapps目录并运行startup脚本),启动后监听端口处理HTTP请求。

    2025年6月16日
    000
  • 如何用Java解析XML文件?

    Java解析XML文件常用DOM、SAX或StAX方式:DOM加载整个文档到内存树结构;SAX基于事件流逐行解析节省内存;StAX提供双向解析,也可用JAXB实现对象绑定或第三方库如JDOM/DOM4J简化操作。

    2025年6月9日
    100
  • Java如何轻松读取数值数据

    在Java中读取数值,通常使用Scanner类的nextInt()、nextDouble()等方法,或通过BufferedReader读取字符串后转换为数值类型(如Integer.parseInt())。

    2025年6月3日
    500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN