import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame {
    private JTextField displayField;
    private double num1 = 0;
    private double num2 = 0;
    private char operator;

    public Calculator() {
        // 设置窗口标题
        setTitle("简易计算器");
        // 设置窗口大小
        setSize(300, 400);
        // 设置窗口关闭时的操作
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 设置布局为边界布局
        setLayout(new BorderLayout());

        // 创建显示结果的文本框
        displayField = new JTextField();
        displayField.setEditable(false);
        add(displayField, BorderLayout.NORTH);

        // 创建面板用于放置按钮
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 4));

        // 数字按钮0-9
        for (int i = 0; i < 10; i++) {
            JButton button = new JButton(String.valueOf(i));
            button.addActionListener(new ButtonClickListener());
            buttonPanel.add(button);
        }

        // 操作符按钮 + - * /
        JButton addButton = new JButton("+");
        addButton.addActionListener(new OperatorClickListener('+'));
        buttonPanel.add(addButton);

        JButton subtractButton = new JButton("-");
        subtractButton.addActionListener(new OperatorClickListener('-'));
        buttonPanel.add(subtractButton);

        JButton multiplyButton = new JButton("*");
        multiplyButton.addActionListener(new OperatorClickListener('*'));
        buttonPanel.add(multiplyButton);

        JButton divideButton = new JButton("/");
        divideButton.addActionListener(new OperatorClickListener('/'));
        buttonPanel.add(divideButton);

        // 等于按钮
        JButton equalButton = new JButton("=");
        equalButton.addActionListener(new EqualClickListener());
        buttonPanel.add(equalButton);

        // 清除按钮
        JButton clearButton = new JButton("C");
        clearButton.addActionListener(new ClearClickListener());
        buttonPanel.add(clearButton);

        add(buttonPanel, BorderLayout.CENTER);
    }

    // 数字按钮点击监听器
    private class ButtonClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton button = (JButton) e.getSource();
            displayField.setText(displayField.getText() + button.getText());
        }
    }

    // 操作符按钮点击监听器
    private class OperatorClickListener implements ActionListener {
        private char op;

        public OperatorClickListener(char op) {
            this.op = op;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            num1 = Double.parseDouble(displayField.getText());
            operator = op;
            displayField.setText("");
        }
    }

    // 等于按钮点击监听器
    private class EqualClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            num2 = Double.parseDouble(displayField.getText());
            double result = 0;
            switch (operator) {
                case '+':
                    result = num1 + num2;
                    break;
                case '-':
                    result = num1 - num2;
                    break;
                case '*':
                    result = num1 * num2;
                    break;
                case '/':
                    if (num2!= 0) {
                        result = num1 / num2;
                    } else {
                        JOptionPane.showMessageDialog(Calculator.this, "除数不能为0", "错误", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                    break;
            }
            displayField.setText(String.valueOf(result));
        }
    }

    // 清除按钮点击监听器
    private class ClearClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            displayField.setText("");
            num1 = 0;
            num2 = 0;
            operator = ' ';
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

这段代码的主要思路如下:

界面搭建部分


  1. 整体框架
    首先创建一个JFrame作为整个计算器的窗口,设置其标题、大小以及关闭操作等基本属性。采用BorderLayout布局,将界面分为北部(用于显示计算结果的文本框区域)和中部(放置按钮的面板区域)。
  2. 文本框创建
    创建一个JTextField用于显示输入的数字以及计算结果,设置其为不可编辑状态,放置在窗口的北部区域。
  3. 按钮面板与按钮添加
    创建一个JPanel作为按钮面板,采用GridLayout布局(4 行 4 列)方便排列按钮。然后循环添加数字按钮 0 - 9,每个按钮点击时将对应的数字添加到显示文本框中。接着分别创建并添加操作符按钮(+-*/),每个操作符按钮点击时会记录当前输入的第一个数字以及对应的操作符,并清空显示文本框准备输入第二个数字;再添加等于按钮和清除按钮,等于按钮用于执行计算操作并显示结果,清除按钮用于清空所有相关数据和显示内容。

事件监听器部分


  1. 数字按钮监听器(ButtonClickListener
    当点击数字按钮时,获取按钮对应的数字文本,然后将其追加到显示文本框已有的文本内容后面,实现数字的连续输入。
  2. 操作符按钮监听器(OperatorClickListener
    针对每个操作符创建对应的监听器实例,在点击操作符按钮时,将当前显示文本框中的数字解析为double类型并赋值给num1,记录下操作符,然后清空显示文本框,为输入第二个数字做准备。
  3. 等于按钮监听器(EqualClickListener
    点击等于按钮时,将当前显示文本框中的数字解析为num2,然后根据之前记录的操作符进行相应的四则运算。如果是除法且除数为 0,则弹出错误提示框;否则计算出结果并将结果显示在文本框中。
  4. 清除按钮监听器(ClearClickListener
    点击清除按钮时,会清空显示文本框的内容,同时将记录的数字(num1num2)重置为 0,操作符也重置为空字符,达到清除所有状态的效果。


最后在main方法中,通过SwingUtilities.invokeLater方法在事件分发线程中创建并显示计算器窗口,确保图形界面的正确初始化和显示。