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(); } }
关键逻辑说明
- 状态变量:
num1存储第一个数字,num2存储第二个数字,operator记录运算符,isOperatorEntered标记是否已输入运算符,用来切换数字输入阶段。 - 数字按钮优化:将ActionCommand直接设为数字本身,用正则匹配简化判断逻辑;输入运算符后,自动清空当前输入框开始第二个数字的输入。
- 运算符处理:点击运算符时,将当前输入的字符串转为
num1,记录运算符,并在屏幕上显示完整的输入表达式。 - 计算逻辑:点击等于按钮时,将当前输入转为
num2,根据运算符执行计算,处理了除数为0的错误情况,结果会保留为下一次计算的初始值。 - 清空功能:通过
resetState()方法统一重置所有状态,恢复初始状态。
内容的提问来源于stack exchange,提问作者Tristan Day
相关产品推荐
相关产品推荐

