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
相关产品推荐
相关产品推荐

