You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java GUI计算器连续加法功能异常求助(如1+1+1计算错误)

解决Java GUI计算器连续加法问题

原代码的核心问题

  • 点击加号按钮时未给operator赋值,导致compute方法无法识别运算类型
  • 数字按钮直接覆盖文本框内容,既无法输入多位数,也打乱了连续运算的输入逻辑
  • 等号按钮未绑定事件处理,无法完成最终运算
  • 使用buffer != ""进行字符串非空判断存在空指针风险,应改用!buffer.isEmpty()

修改后的完整代码

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.Font;

public class Calc {

    private JFrame frame;
    // 初始化变量避免空指针
    String buffer = "";
    String operator = "";
    private JTextField textField;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Calc window = new Calc();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Calc() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,200);
        
        JButton btnOne = new JButton("1");
        btnOne.setFont(new Font("Helvetica", Font.PLAIN, 13));
        btnOne.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // 改为追加文本,支持多位数输入
                textField.setText(textField.getText() + "1");
            }
        });
        
        textField = new JTextField();
        textField.setColumns(10);
        
        JButton btnAdd = new JButton("+");
        btnAdd.setFont(new Font("Helvetica", Font.PLAIN, 13));
        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                // 已有缓存值和运算符时,先完成上一次运算
                if (!buffer.isEmpty() && !operator.isEmpty()) {
                    double left = Double.parseDouble(buffer);
                    double right = Double.parseDouble(textField.getText());
                    buffer = compute(operator, left, right);
                } else if (buffer.isEmpty()) {
                    // 第一次点击加号,缓存当前输入值
                    buffer = textField.getText();
                }
                operator = "+"; // 记录当前运算类型
                textField.setText(""); // 清空输入框准备下一个数
            }
        });
        
        JButton btnEquals = new JButton("=");
        btnEquals.setFont(new Font("Helvetica", Font.PLAIN, 13));
        btnEquals.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // 完成最后一次运算
                if (!buffer.isEmpty() && !operator.isEmpty() && !textField.getText().isEmpty()) {
                    double left = Double.parseDouble(buffer);
                    double right = Double.parseDouble(textField.getText());
                    String result = compute(operator, left, right);
                    textField.setText(result);
                    // 重置缓存,准备下一轮计算
                    buffer = "";
                    operator = "";
                }
            }
        });
        
        GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGap(4)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                        .addGroup(groupLayout.createSequentialGroup()
                            .addComponent(btnOne)
                            .addPreferredGap(ComponentPlacement.UNRELATED)
                            .addComponent(textField, GroupLayout.PREFERRED_SIZE, 338, GroupLayout.PREFERRED_SIZE))
                        .addComponent(btnAdd)
                        .addComponent(btnEquals))
                    .addGap(21))
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGap(5)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(btnOne)
                        .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addGap(5)
                    .addComponent(btnAdd)
                    .addGap(5)
                    .addComponent(btnEquals))
        );
        frame.getContentPane().setLayout(groupLayout);
        frame.setVisible(true);
    }
    
    public String compute(String operator, double left, double right) {
        switch (operator) {
            case "+" : return Double.toString(left+right);
            default  : return "ERR";
        }
    }
}

关键修改说明

  • 变量初始化:给buffer和operator赋初始空字符串,避免空指针异常
  • 数字输入逻辑:将覆盖文本改为追加文本,支持多位数输入,同时保留输入状态
  • 加号按钮逻辑:
    • 若已有未完成的运算,先计算中间结果并更新缓存
    • 记录当前运算符为"+",清空输入框准备下一个数字
  • 等号按钮逻辑:完成最后一次运算,显示结果后重置缓存,为下一轮计算做准备
  • 非空判断优化:使用!buffer.isEmpty()替代buffer != "",规避空指针风险

测试连续加法流程:输入1→点击+→输入1→点击+→输入1→点击=,结果将显示3,符合预期。

内容的提问来源于stack exchange,提问作者user22190533

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:00:08