Java Swing计算器GUI三类功能异常问题解决咨询
Java Swing 计算器三个功能异常修复方案
前置准备
在类中新增两个状态标记成员变量,用于区分当前操作阶段:
// 标记是否刚展示完运算结果,等待下一轮输入 private boolean isResultShown = false; // 标记是否触发了除0错误 private boolean isError = false;
1. 除数为0时输出0.0而非Error的修复
根因
除0判断分支的if/else未加花括号,Java语法中if不带花括号时仅控制紧随其后的1行代码,执行逻辑为:
- 触发除0时先执行
text.setText("Error") - 无论是否除0,等于键分支末尾都会执行
text.setText(String.valueOf(ans)) - 此时
ans保持默认初始值0.0,直接覆盖了Error文本
修复修改
第一步:修改等于键分支的/运算逻辑
case '/': if (num2 == 0) { text.setText("Error"); // 标记错误状态,阻止后续结果输出 isError = true; } else { ans = num1 / num2; } break;
第二步:修改等于键分支的末尾输出逻辑
// 原直接输出结果改为先判断错误状态 if (!isError) { text.setText(formatResult(ans)); } // 标记已展示结果状态,重置错误标记 isResultShown = true; isError = false; label.setText("");
2. 按等于后按数字拼接而非清空的修复
根因
数字按键的处理逻辑直接在当前文本框内容后拼接数字,没有判断当前是否已展示上一轮结果,缺少状态区分。
修复修改
修改数字按键的循环处理逻辑:
for(int i=0;i<10;i++) { if(e.getSource() == numbers[i]) { // 若刚展示完结果、或当前显示Error,先清空文本框 if (isResultShown || isError || text.getText().equals("Error")) { text.setText(""); // 重置状态标记 isResultShown = false; isError = false; } text.setText(text.getText().concat(String.valueOf(i))); } }
同步修改小数点按键的处理逻辑,避免按完结果直接按小数点出现拼接问题:
if(e.getSource()==dec) { if (isResultShown || isError || text.getText().equals("Error")) { text.setText(""); isResultShown = false; isError = false; } if (text.getText().contains(".")) { return; } else { text.setText(text.getText() + "."); } }
在加、减、乘、除四个运算符的分支末尾,补充状态重置(以加法分支为例,其他运算符分支同理):
if(e.getSource()==add) { num1 = Double.parseDouble(text.getText()); operator ='+'; label.setText(text.getText() + "+"); text.setText(""); // 按下运算符后进入输入第二个操作数的状态 isResultShown = false; }
3. 结果附带多余.0后缀的修复
根因
直接将Double类型的运算结果转成字符串,Java中整数形式的Double值(如2.0)转字符串默认保留.0后缀。之前用endsWith、字符串替换失效,通常是处理时机不对,或没有判断值本身的小数属性直接硬替换。
修复修改
新增一个结果格式化的辅助方法,根据结果是否为整数决定输出格式:
private String formatResult(double result) { // 判断是否无小数部分 if (result % 1 == 0) { // 整数则转成Long输出,自动去掉.0后缀 return String.valueOf((long) result); } // 非整数直接输出原字符串 return String.valueOf(result); }
在等于键输出结果的位置,调用该方法处理即可,对应代码为之前的text.setText(formatResult(ans));
如果需要限制小数位数避免浮点数精度问题,可使用DecimalFormat调整输出格式,基础作业场景上述逻辑足够满足需求。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

