JTextArea 显示异常文本:误用 JTextField 对象而非其内容

当向 jtextarea 追加内容时,若错误地将 jtextfield 实例(而非其文本)直接拼接进字符串,会触发 tostring() 方法,导致显示类似 `javax.swing.jtextfield[,0,0,0x0,...]` 的乱码;正确做法是始终调用 `.gettext()` 获取实际输入值。

在您的 AddBtnMouseClicked 方法中,问题根源明确出现在这一行:

BillTxt.setText(BillTxt.getText()+"    "+i+"               "+ProdName+"               "+Uprice+"               "+ProdQty.getText()+"               "+ProdTot+"\n");

此处 ProdName 是一个 JTextField 类型的变量(如声明所示:private java

x.swing.JTextField ProdName;),而您却将其直接用于字符串拼接。Java 会自动调用其 toString() 方法——该方法默认返回对象的类名、哈希码及内部状态,并非用户输入的文本,因此第二项起便出现“奇怪文本”(如 javax.swing.JTextField[...)。

✅ 正确写法应为:

BillTxt.setText(BillTxt.getText() 
    + "    " + i 
    + "               " + ProdName.getText()   // ✅ 调用 getText() 获取字符串
    + "               " + Uprice 
    + "               " + ProdQty.getText() 
    + "               " + ProdTot + "\n");

⚠️ 同时,请注意以下关键改进点:

  • 命名规范:Java 社区约定使用驼峰命名法(camelCase)命名变量,如 prodNameField、prodQtyField,而非 ProdName(易与类名混淆,且违反标准)。不规范的命名是本次 bug 的深层诱因——它掩盖了 ProdName 是组件而非字符串的事实。
  • 避免重复拼接性能损耗:BillTxt.getText() 每次调用都会复制当前全部文本,大量追加时建议改用 append() 方法提升效率:
    BillTxt.append("    " + i 
        + "               " + prodNameField.getText()
        + "               " + Uprice 
        + "               " + prodQtyField.getText() 
        + "               " + ProdTot + "\n");
  • 首行格式统一性:当前首次添加时使用 setText(),后续用 getText()+... 拼接,逻辑割裂。推荐全部统一为 append(),并在首次添加前清空或初始化标题:
    if (i == 1) {
        BillTxt.setText("============Tante Emma Laden============\n" +
                        "Nummer  Produkt  Preis  Menge  Summe\n");
    }
    BillTxt.append(String.format("%-6d%-12s%-8.2f%-8s%-8.2f%n", 
        i, prodNameField.getText(), Uprice, prodQtyField.getText(), ProdTot));

? 总结:JTextArea 显示乱码的本质是类型误用,而非编码或 UI 设置问题。始终区分「组件对象」与「其承载的数据」,坚持使用 .getText()、.setText(...) 等显式方法操作内容,并遵循 Java 命名规范,可从根本上杜绝此类问题。