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

Java GUI计算器开发问题:如何获取完整输入数字并实现计算

Java GUI计算器数字收集与计算功能实现方案

要解决多位数收集和计算的问题,需要在现有代码基础上增加状态管理,区分第一个数字、运算符和第二个数字的输入阶段,具体修改如下:

核心修改点

  • 新增类成员变量,存储计算所需的状态:第一个数字、运算符、是否已输入运算符的标记
  • 调整数字按钮的逻辑,根据当前状态拼接对应数字
  • 运算符按钮触发时,保存第一个数字并切换输入状态
  • 等于按钮执行计算并展示结果,同时重置状态
  • 清空按钮重置所有状态和显示

修改后的完整代码

package calculator;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;

public class Calculator {
 
    String currentText = "";
    JTextField screen;
  
    JButton button1;
    JButton button2;
    JButton button3;
    JButton button4;
    JButton button5;
    JButton button6;
    JButton button7;
    JButton button8;
    JButton button9;
    
    JButton add;
    JButton subtract;
    JButton multiply;
    JButton divide;
    JButton clr;
    JButton equals;

    JPanel panel;
    JFrame frame;
    
    // 新增状态变量
    private double num1;
    private double num2;
    private String operator;
    private boolean isOperatorEntered;
    
    
    public Calculator(){
        
        frame = new JFrame("calculator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.setSize(300, 425);
        Border border = BorderFactory.createLineBorder(Color.black,1);
        
        //set up panel
        panel = new JPanel();
        panel.setLayout(null);
        
        screen = new JTextField("0");
        screen.setLocation(25,25);
        screen.setSize(175,50);
        screen.setBackground(Color.white);
        screen.setOpaque(true);
    
        button1 = new JButton("1");
        button1.setLocation(25,100);
        button1.setSize(50,50);
        button1.addActionListener(new Click());
        button1.setActionCommand("1"); // 简化ActionCommand为数字本身,减少判断
        
        button2 = new JButton("2");
        button2.setLocation(25,155);
        button2.setSize(50,50);
        button2.addActionListener(new Click());
        button2.setActionCommand("2");
        
        button3 = new JButton("3");
        button3.setLocation(25,210);
        button3.setSize(50,50);
        button3.addActionListener(new Click());
        button3.setActionCommand("3");
        
        button4 = new JButton("4");
        button4.setLocation(25,265);
        button4.setSize(50,50);
        button4.addActionListener(new Click());
        button4.setActionCommand("4");
        
        button5 = new JButton("5");
        button5.setLocation(80,100);
        button5.setSize(50,50);
        button5.addActionListener(new Click());
        button5.setActionCommand("5");
        
        button6 = new JButton("6");
        button6.setLocation(80,155);
        button6.setSize(50,50);
        button6.addActionListener(new Click());
        button6.setActionCommand("6");
        
        button7 = new JButton("7");
        button7.setLocation(80,210);
        button7.setSize(50,50);
        button7.addActionListener(new Click());
        button7.setActionCommand("7");
        
        button8 = new JButton("8");
        button8.setLocation(80,265);
        button8.setSize(50,50);
        button8.addActionListener(new Click());
        button8.setActionCommand("8");
        
        button9 = new JButton("9");
        button9.setLocation(50,320);
        button9.setSize(50,50);
        button9.addActionListener(new Click());
        button9.setActionCommand("9");
        
        add = new JButton("+");
        add.setLocation(150,100);
        add.setSize(50,50);
        add.addActionListener(new Click());
        add.setActionCommand("+");
        
        subtract = new JButton("-");
        subtract.setLocation(150,155);
        subtract.setSize(50,50);
        subtract.addActionListener(new Click());
        subtract.setActionCommand("-");
        
        multiply = new JButton("*");
        multiply.setLocation(150, 210);
        multiply.setSize(50,50);
        multiply.addActionListener(new Click());
        multiply.setActionCommand("*");
        
        divide = new JButton("÷");
        divide.setLocation(150,265);
        divide.setSize(50,50);
        divide.addActionListener(new Click());
        divide.setActionCommand("÷");
        
        clr = new JButton("CLR");
        clr.setLocation(205, 120);
        clr.setSize(75,50);
        clr.addActionListener(new Click());
        clr.setActionCommand("clr");
        
        equals = new JButton("=");
        equals.setLocation(205,175);
        equals.setSize(75,50);
        equals.addActionListener(new Click());
        equals.setActionCommand("=");
        
        panel.add(screen);
        
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        panel.add(button4);
        panel.add(button5);
        panel.add(button6);
        panel.add(button7);
        panel.add(button8);
        panel.add(button9);
        
        panel.add(add);
        panel.add(subtract);
        panel.add(multiply);
        panel.add(divide);
        panel.add(clr);
        panel.add(equals);
        
        frame.setContentPane(panel);
        frame.setVisible(true);
        
    }
     class Click implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        String action = e.getActionCommand();
        
        // 处理数字按钮
        if (action.matches("[0-9]")) {
            // 如果刚输入完运算符,清空当前输入框开始第二个数字
            if (isOperatorEntered) {
                currentText = "";
                isOperatorEntered = false;
            }
            currentText += action;
            screen.setText(currentText);
        } 
        // 处理运算符按钮
        else if (action.equals("+") || action.equals("-") || action.equals("*") || action.equals("÷")) {
            // 确保当前有输入的数字,才保存第一个数字
            if (!currentText.isEmpty()) {
                num1 = Double.parseDouble(currentText);
                operator = action;
                isOperatorEntered = true;
                // 在屏幕上显示运算符
                screen.setText(currentText + " " + operator + " ");
            }
        } 
        // 处理等于按钮
        else if (action.equals("=")) {
            if (!currentText.isEmpty() && operator != null) {
                num2 = Double.parseDouble(currentText);
                double result = 0;
                // 根据运算符执行计算
                switch (operator) {
                    case "+":
                        result = num1 + num2;
                        break;
                    case "-":
                        result = num1 - num2;
                        break;
                    case "*":
                        result = num1 * num2;
                        break;
                    case "÷":
                        // 处理除数为0的情况
                        if (num2 != 0) {
                            result = num1 / num2;
                        } else {
                            screen.setText("Error");
                            resetState();
                            return;
                        }
                        break;
                }
                // 显示结果
                screen.setText(String.valueOf(result));
                // 将结果作为下一次计算的第一个数字
                currentText = String.valueOf(result);
                operator = null;
                isOperatorEntered = false;
            }
        } 
        // 处理清空按钮
        else if (action.equals("clr")) {
            resetState();
            screen.setText("0");
        }
    }
    
    // 重置所有状态变量
    private void resetState() {
        currentText = "";
        num1 = 0;
        num2 = 0;
        operator = null;
        isOperatorEntered = false;
    }
}

    
    public static void main(String[] args) {
        Calculator gui = new Calculator();
    }
    
}

关键逻辑说明

  1. 状态变量:num1存储第一个数字,num2存储第二个数字,operator记录运算符,isOperatorEntered标记是否已输入运算符,用来切换数字输入阶段。
  2. 数字按钮优化:将ActionCommand直接设为数字本身,用正则匹配简化判断逻辑;输入运算符后,自动清空当前输入框开始第二个数字的输入。
  3. 运算符处理:点击运算符时,将当前输入的字符串转为num1,记录运算符,并在屏幕上显示完整的输入表达式。
  4. 计算逻辑:点击等于按钮时,将当前输入转为num2,根据运算符执行计算,处理了除数为0的错误情况,结果会保留为下一次计算的初始值。
  5. 清空功能:通过resetState()方法统一重置所有状态,恢复初始状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:17:00