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

Java报表输出问题:表头表格分窗显示,求displayReport方法参数配置

问题描述

我需要在一个窗口中输出贷款报表,已经编写了displayHeading(表头)和displayTable(表格)方法,但运行后二者分别显示在不同窗口。我知道需要编写displayReport方法整合显示,但不清楚该方法的正确参数形式。以下是我的实现代码:

import java.text.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Main
{

    static String name, address, city, state;
    static int zip, month, date, year, code;
    static double amount = 0, rate = 0;

    public static void main(String[] args)
    {
        InputFile loanInfo;
        loanInfo = new InputFile("fcrc loan data.txt");

        JFrame jf;
        JTextArea jta;
        JScrollPane jsp;

        jf = new JFrame();
        jta = new JTextArea();
        jsp = new JScrollPane(jta);

        jf.setSize(1200, 350);
        jf.setLocation(400, 250);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jf.add(jsp);
        jf.setVisible(true);

        while (!loanInfo.eof()) 
        {
            name = loanInfo.readString();
            address = loanInfo.readString();
            city = loanInfo.readString();
            state = loanInfo.readWord();
            zip = loanInfo.readInt();
            month = loanInfo.readInt();
            date = loanInfo.readInt();
            year = loanInfo.readInt();
            amount = loanInfo.readDouble();
            rate = loanInfo.readDouble();
            code = loanInfo.readInt();

            displayReport();

/*I know this is probably where the issue is. I just don't know what the appropriate formals are to finish the method*/


        }

    }
    
    public static void displayReport()
    {
        displayHeading(name, address, city, state, zip, month, date, year, amount, code, rate);
        displayTable(amount);
        
    }

    public static void displayTable(double amount)
    {
        int paymentNumber;

        double payment = 0, interest, principal, balance;

        JFrame jf;
        JTextArea jta;
        JScrollPane jsp;

        jf = new JFrame();
        jta = new JTextArea();
        jsp = new JScrollPane(jta);

        jf.setSize(1200, 350);
        jf.setLocation(400, 250);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jf.add(jsp);
        jf.setVisible(true);

        DecimalFormat numFormat;
        numFormat = new DecimalFormat("0.00");
        NumberFormat currencyFormat;
        currencyFormat = NumberFormat.getCurrencyInstance();
        balance = amount;
        paymentNumber = 0;
        double totalPayment = 0;
        double totalIntPaid = 0;
        while (balance > 0) 
        {

            ++paymentNumber;
            String dueDate = calcDueDate(month, date, year, paymentNumber - 1);
            interest = calcInterest(balance, rate);
            if (balance <= payment) 
            {
                payment = balance;
                principal = balance;
                balance = 0;
            } else 
            {
                payment = calcPayment(code, amount);
                principal = calcPrincipal(payment, interest);
                balance = calcBalance(balance, principal);
            }
            totalPayment = totalPayment + payment;
            totalIntPaid = totalIntPaid + interest;
            jta.append(paymentNumber + "\t\t" + dueDate + "\t\t$" + numFormat.format(payment) + "\t\t" + currencyFormat.format(interest) + "\t\t" + currencyFormat.format(principal) + "\t\t" + currencyFormat.format(balance) + "\n");

        }
        
        jta.append("\n");
        jta.append(" " + "\t\t" + " " + "\t\t" + "Totals: " + currencyFormat.format(totalPayment) + "\t" + currencyFormat.format(totalIntPaid) + "\n");
        jta.append("\n\n");

    }

    public static void displayHeading(String name, String address1, String city, String state, int zip, int month, int day, int year, double amount, int code, double rate)
    {
        DecimalFormat numFormat;
        numFormat = new DecimalFormat("0.00");
        NumberFormat currencyFormat;
        currencyFormat = NumberFormat.getCurrencyInstance();

        JFrame jf;
        JTextArea jta;
        JScrollPane jsp;

        jf = new JFrame();
        jta = new JTextArea();
        jsp = new JScrollPane(jta);

        jf.setSize(1200, 350);
        jf.setLocation(400, 250);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jf.add(jsp);
        jf.setVisible(true);

        jta.append("First Community Redevelopment Corporation\n");
        jta.append("101 1st Street\n");
        jta.append("Bloomington, TN 41663\n");
        jta.append("\n");
        jta.append("\t\t\t\t" + name + "\n");
        jta.append("\t\t\t\t" + address1 + "\n");
        jta.append("\t\t\t\t" + city + ", " + state + ", " + zip + "\n");
        jta.append("\n");
        jta.append("LOAN AMOUNT:\t\t" + currencyFormat.format(amount) + "\n");
        jta.append("INTEREST RATE:\t\t" + numFormat.format(rate) + "%\n");
        jta.append("\n");
        jta.append("Payment #\tDue Date\t\tPayment\t\tInterest\tPrincipal\tBalance\n");
        jta.append("---------------------------------------------------------------------------------------------------\n");
    }
   

    public static double calcPayment(int code, double amount)
    {
        double payment;
        payment = 0;

        switch (code) 
        {
            case 0:
                payment = 50.00;
                break;
            case 1:
                payment = 55.00;
                break;
            case 2:
                payment = 75.00;
                break;
            case 3:
                payment = 100.00;
                break;
            case 4:
                payment = .05 * amount;
                break;
            case 5:
                payment = .06 * amount;
                break;
            case 6:
                payment = .05 * amount;
                break;
            case 7:
                payment = .04 * amount;
                break;
            case 8:
                payment = .03 * amount;
                break;
            case 9:
                payment = .02 * amount;
                break;
            default:
                System.out.println("Bad payment code");
        }
        return payment;
    }

    public static double calcInterest(double balance, double rate)
    {
        double interest;
        interest = rate / 12 * balance;
        return interest;
    }

    public static double calcPrincipal(double payment, double interest)
    {
        double principal;

        principal = payment - interest;
        return principal;
    }

    public static double calcBalance(double balance, double principal)
    {
        balance -= principal;
        return balance;
    }

    public static String calcDueDate(int month, int day, int year, int payNum)
    {
        String monthStr = "";
        month = month + payNum - 1;
        year = year + (month / 12);
        month = month % 12;
        if (month == 0) 
        {
            year--;
        }
        switch (month) 
        {
            case 1:
                monthStr = "Jan.";
                break;
            case 2:
                monthStr = "Feb.";
                break;
            case 3:
                monthStr = "Mar.";
                break;
            case 4:
                monthStr = "Apr.";
                break;
            case 5:
                monthStr = "May";
                break;
            case 6:
                monthStr = "Jun.";
                break;
            case 7:
                monthStr = "Jul.";
                break;
            case 8:
                monthStr = "Aug.";
                break;
            case 9:
                monthStr = "Sept.";
                break;
            case 10:
                monthStr = "Oct.";
                break;
            case 11:
                monthStr = "Nov.";
                break;
            case 0:
                monthStr = "Dec.";
                break;
            default:
                System.out.println("Invalid month: " + month);

        }
        return monthStr + " " + day + ", " + year;
    }
}
解决方案

问题根源是displayHeading和displayTable方法内部都重新创建了JFrame、JTextArea组件,导致每次调用都会弹出新窗口。要实现同一窗口输出,需要复用主方法中创建好的JTextArea,让两个方法都往同一个文本区域追加内容。具体修改步骤如下:

1. 修改方法参数,传入共享的JTextArea

  • 给displayHeading添加JTextArea jta作为第一个参数,移除方法内创建JFrame、JTextArea的代码,直接使用传入的jta进行内容追加。
  • 给displayTable添加JTextArea jta作为第一个参数,同样移除内部的窗口组件创建代码,复用传入的jta。

2. 调整displayReport方法的参数

让displayReport接收JTextArea和所有贷款数据作为参数,再将这些参数传递给displayHeading和displayTable。

3. 主方法中调用displayReport时传入正确参数

在主循环里调用displayReport时,传入主方法中创建的jta和当前读取到的所有贷款数据。

修改后的完整代码

import java.text.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Main
{
    // 静态变量保留,用于存储读取到的贷款数据
    static String name, address, city, state;
    static int zip, month, date, year, code;
    static double amount = 0, rate = 0;

    public static void main(String[] args)
    {
        InputFile loanInfo;
        loanInfo = new InputFile("fcrc loan data.txt");

        JFrame jf;
        JTextArea jta;
        JScrollPane jsp;

        jf = new JFrame();
        jta = new JTextArea();
        jsp = new JScrollPane(jta);

        jf.setSize(1200, 350);
        jf.setLocation(400, 250);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(jsp);
        jf.setVisible(true);

        while (!loanInfo.eof()) 
        {
            name = loanInfo.readString();
            address = loanInfo.readString();
            city = loanInfo.readString();
            state = loanInfo.readWord();
            zip = loanInfo.readInt();
            month = loanInfo.readInt();
            date = loanInfo.readInt();
            year = loanInfo.readInt();
            amount = loanInfo.readDouble();
            rate = loanInfo.readDouble();
            code = loanInfo.readInt();

            // 传入共享的jta和当前贷款数据
            displayReport(jta, name, address, city, state, zip, month, date, year, amount, code, rate);
        }
    }
    
    // displayReport接收共享文本区域和所有贷款数据
    public static void displayReport(JTextArea jta, String name, String address, String city, String state, int zip, int month, int date, int year, double amount, int code, double rate)
    {
        displayHeading(jta, name, address, city, state, zip, month, date, year, amount, code, rate);
        displayTable(jta, amount);
    }

    // displayTable接收共享文本区域和贷款金额
    public static void displayTable(JTextArea jta, double amount)
    {
        int paymentNumber;
        double payment = 0, interest, principal, balance;

        DecimalFormat numFormat = new DecimalFormat("0.00");
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
        balance = amount;
        paymentNumber = 0;
        double totalPayment = 0;
        double totalIntPaid = 0;

        while (balance > 0) 
        {
            ++paymentNumber;
            String dueDate = calcDueDate(month, date, year, paymentNumber - 1);
            interest = calcInterest(balance, rate);
            
            if (balance <= payment) 
            {
                payment = balance;
                principal = balance;
                balance = 0;
            } else 
            {
                payment = calcPayment(code, amount);
                principal = calcPrincipal(payment, interest);
                balance = calcBalance(balance, principal);
            }
            
            totalPayment += payment;
            totalIntPaid += interest;
            jta.append(paymentNumber + "\t\t" + dueDate + "\t\t$" + numFormat.format(payment) + "\t\t" + currencyFormat.format(interest) + "\t\t" + currencyFormat.format(principal) + "\t\t" + currencyFormat.format(balance) + "\n");
        }
        
        jta.append("\n");
        jta.append(" " + "\t\t" + " " + "\t\t" + "Totals: " + currencyFormat.format(totalPayment) + "\t" + currencyFormat.format(totalIntPaid) + "\n");
        jta.append("\n\n");
    }

    // displayHeading接收共享文本区域和所有贷款数据
    public static void displayHeading(JTextArea jta, String name, String address1, String city, String state, int zip, int month, int day, int year, double amount, int code, double rate)
    {
        DecimalFormat numFormat = new DecimalFormat("0.00");
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();

        jta.append("First Community Redevelopment Corporation\n");
        jta.append("101 1st Street\n");
        jta.append("Bloomington, TN 41663\n");
        jta.append("\n");
        jta.append("\t\t\t\t" + name + "\n");
        jta.append("\t\t\t\t" + address1 + "\n");
        jta.append("\t\t\t\t" + city + ", " + state + ", " + zip + "\n");
        jta.append("\n");
        jta.append("LOAN AMOUNT:\t\t" + currencyFormat.format(amount) + "\n");
        jta.append("INTEREST RATE:\t\t" + numFormat.format(rate) + "%\n");
        jta.append("\n");
        jta.append("Payment #\tDue Date\t\tPayment\t\tInterest\tPrincipal\tBalance\n");
        jta.append("---------------------------------------------------------------------------------------------------\n");
    }
   
    // 以下计算方法保持不变
    public static double calcPayment(int code, double amount)
    {
        double payment = 0;
        switch (code) 
        {
            case 0: payment = 50.00; break;
            case 1: payment = 55.00; break;
            case 2: payment = 75.00; break;
            case 3: payment = 100.00; break;
            case 4: payment = .05 * amount; break;
            case 5: payment = .06 * amount; break;
            case 6: payment = .05 * amount; break;
            case 7: payment = .04 * amount; break;
            case 8: payment = .03 * amount; break;
            case 9: payment = .02 * amount; break;
            default: System.out.println("Bad payment code");
        }
        return payment;
    }

    public static double calcInterest(double balance, double rate)
    {
        return rate / 12 * balance;
    }

    public static double calcPrincipal(double payment, double interest)
    {
        return payment - interest;
    }

    public static double calcBalance(double balance, double principal)
    {
        return balance - principal;
    }

    public static String calcDueDate(int month, int day, int year, int payNum)
    {
        String monthStr = "";
        month += payNum - 1;
        year += month / 12;
        month %= 12;
        
        if (month == 0) 
        {
            year--;
            month = 12;
        }
        
        switch (month) 
        {
            case 1: monthStr = "Jan."; break;
            case 2: month
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:01:23