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
相关产品推荐
相关产品推荐

