You need to enable JavaScript to run this app. Java Swing计算器GUI三类功能异常问题解决咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 13:15:03