简体   繁体   English

Java JOptionPane Output

[英]Java JOptionPane Output

Can anybody tell me what I am doing wrong here.谁能告诉我我在这里做错了什么。 I need to calculate some values from user-input into some JOptionPane-input-dialog-boxes, then outputting the answers.我需要从用户输入计算一些值到一些 JOptionPane-input-dialog-boxes,然后输出答案。

I would greatly appreciate any help I get.我将非常感谢我得到的任何帮助。 Thanks In Advance!提前致谢!

  1. Input输入
    • Number of loans to compare (Could be more than 1)要比较的贷款数量(可能超过 1 个)
    • Selling price售价
    • Down payment首付
    • You will ask the following for each loan they want to compare对于他们想要比较的每笔贷款,您将询问以下内容
      • Interest rate利率
      • Number of years年数
  2. Processing加工
    • You will need to calculate the monthly payment for each scenario listed in part d for the given interest rates and number of years.对于给定的利率和年数,您将需要计算 d 部分中列出的每个方案的每月付款。
  3. Output Output
    • Selling price售价
    • Down Payment首付
    • Loan Amount贷款额度
    • List for each scenario每个场景的列表
      • interest兴趣
      • years
      • payment支付

Here's my code so far:到目前为止,这是我的代码:

    package javamortgagecalculator;
    import javax.swing.JOptionPane;
    import java.util.*;       
    public class JavaMortgageCalculator {
         public static void main(String[] args) {       
              //A. Enter the Number Of Loans to compare
              String numberOfLoansString = JOptionPane.showInputDialog("Enter the Number Of Loans to Compare"); 
              //Convert numberOfLoansString to int
              int numberOfLoans = Integer.parseInt(numberOfLoansString);

              //B. Enter the Selling Price of Home
              String sellingPriceString = JOptionPane.showInputDialog("Enter the Loan Amount");
              //Convert homeCostString to double
              double sellingPrice = Double.parseDouble(sellingPriceString);

              //C. Enter the Down Payment on the Home
              String downPaymentString = JOptionPane.showInputDialog("Enter the down payment on the Home");
              double downPayment = Double.parseDouble(downPaymentString);

              //Get the loanAmount by Subtracting the Down Payment from homeCost
              double loanAmount = sellingPrice - downPayment;

              //D. Ask the following for as many number of loans they wish to compare
              //D1 Get the interest rate
              double[] annualInterestRatesArray = new double[numberOfLoans];
              double[] monthlyInterestRateArray = new double[numberOfLoans];
              int[] numberOfYearsArray = new int[numberOfLoans];
              double[] monthlyPaymentArray = new double[numberOfLoans];
              double[] totalPaymentArray = new double[numberOfLoans];
              int counter = 1;

              for (int i=0; i < numberOfLoans; i++)
              {
                  String annualInterestRateString = JOptionPane.showInputDialog("Enter           the interest rate for Scenario " + counter);
                  double annualInterestRate = Double.parseDouble(annualInterestRateString);
                  annualInterestRatesArray[i] = (annualInterestRate);

                  //Obtain monthly interest rate
                  double monthlyInterestRate = annualInterestRate / 1200;
                  monthlyInterestRateArray[i] = (monthlyInterestRate);

                  //D2 Get the number of years
                  String numberOfYearsString = JOptionPane.showInputDialog("Enter the      number of years for Scenario " + counter);
                  int numberOfYears = Integer.parseInt(numberOfYearsString);
                  numberOfYearsArray[i] = (numberOfYears);

                  //Calculate monthly payment
                  double monthlyPayment = loanAmount * monthlyInterestRate / (1 - 1 / Math.pow(1 + monthlyInterestRate, numberOfYears * 12));
                  //Format to keep monthlyPayment two digits after the decimal point
                  monthlyPayment = (int)(monthlyPayment * 100) / 100.0;
                  //Store monthlyPayment values in an array
                  monthlyPaymentArray[i] = (monthlyPayment);

                  //Calculate total Payment
                  double totalPayment = monthlyPaymentArray[i] * numberOfYears * 12;
                  //Format to keep totalPayment two digits after the decimal point
                  totalPayment = (int)(totalPayment * 100) / 100.0;
                  totalPaymentArray[i] = (totalPayment);

                  counter++;
              }

              StringBuilder sb = new StringBuilder();
              for (int i = 0; i < numberOfLoans; i++) {
                     sb.append(String.format("\t \t \t \t \t \n", sellingPrice, downPayment, loanAmount, Arrays.toString(annualInterestRatesArray),           Arrays.toString(numberOfYearsArray), Arrays.toString(monthlyPaymentArray)));
              }
              String toDisplay=sb.toString();

              JOptionPane.showMessageDialog(null, sb.toString(), toDisplay, JOptionPane.INFORMATION_MESSAGE);             
          }
     }

If I was forced, presumably by a large green, and particularly ugly troll masquerading as a programming teacher, to use multiple JOption panes for input and output then here's how I'd tackle the problem.如果我被迫使用多个 JOption 窗格进行输入和 output,大概是被一个大绿色且特别丑陋的巨魔伪装成编程老师,那么这就是我解决问题的方法。 This is meant for your information only... if you hand this in as your own work your teacher will smell a rat, and trolls have google too.这仅供您参考……如果您将其作为自己的工作提交,您的老师会闻到老鼠的味道,而巨魔也有谷歌。

package forums;
import javax.swing.JOptionPane;
import java.text.DecimalFormat;

/**
 * Compares total cost of mortgages (aka ordinary annuity certains)
 */
public class MortgageCalculator
{
  public static void main(String[] args)
  {
    // 1. input
    final double price = Enter.aDouble("the purchase of the property");
    final double deposit = Enter.aDouble("down payment");
    Loan.setPrinciple(price - deposit);

    int numLoans = Enter.anInteger("number of loans to compare");
    Loan[] loans = new Loan[numLoans];
    for ( int i=0; i<numLoans; ++i ) {
      loans[i] = new Loan(
          Enter.aDouble("Annual interest rate for Loan " + (i+1) + "  (eg: 6.75)") / 100.0 / 12.0
        , Enter.anInteger("number of years for Loan " + (i+1) + "  (eg 20)") * 12
      );
    }

    // 3. Output
    final String caption = 
        "Principle " + Format.money(Loan.getPrinciple())
      + " = Price " + Format.money(price) 
      + " - Deposit " + Format.money(deposit);

    StringBuilder results = new StringBuilder(64 + numLoans * 64);
    results.append("Monthly Rate, Months, Monthly Repayment, Total Repayments\n");
    for ( Loan l : loans ) {
      results.append(String.format("%5s, %d, %13s, %13s\n"
        , Format.percent(l.rate)
        , l.periods
        , Format.money(l.payment())
        , Format.money(l.totalPayment())
      ));
    }
    JOptionPane.showMessageDialog(null, results.toString(), caption, JOptionPane.INFORMATION_MESSAGE);
  }

  static class Format
  {
    static java.text.Format MONEY = new DecimalFormat("$#,###.##");
    static String money(double amount) {
      return MONEY.format(amount);
    }

    static java.text.Format PERCENT = new DecimalFormat("0.###%");
    static String percent(double amount) {
      return PERCENT.format(amount);
    }

    static StringBuilder join(String between, Object... values) {
      StringBuilder result = new StringBuilder(values.length * 16);
      if ( values.length > 0 ) {
        result.append(values[0].toString());
        for ( int i=1; i<values.length; ++i ) {
          result.append(between)
            .append(values[i].toString());
        }
      }
      return result;
    }

  } // end class Format

  static class Enter
  {
    public static int anInteger(String fieldDesc) {
      return Integer.parseInt(JOptionPane.showInputDialog("Enter the "+ fieldDesc));
    }

    public static double aDouble(String fieldDesc) {
      return Double.parseDouble(JOptionPane.showInputDialog("Enter the "+ fieldDesc));
    }
  } // end class Enter

} // end class MortgageCalculator

class Loan
{
  private static double principle = 34324.121221312432;
  final double rate;
  final int periods;

  static void setPrinciple(double principle) {
    if (Loan.principle != 34324.121221312432)
      throw new ReadOnlyException("The Principle can't be changed once set.");
    Loan.principle = principle;
  }

  static double getPrinciple() {
    return Loan.principle;
  }

  /**
   * Initialises a new loan objects
   * @param double rate The interest rate per period, as a percentage.
   *  eg: 0.00625 is 7.5% per annum.
   * @param int periods The number of periods of the loan, typically months.
   */
  Loan(double rate, int periods) {
    this.rate = rate;
    this.periods = periods;
  }

  // 2. processing
  double payment() {
    return principle * rate / (1 - 1/Math.pow(1+rate,periods) );
  }

  double totalPayment() {
    return periods * payment();
  }

}

class ReadOnlyException extends RuntimeException 
{
  private static final long serialVersionUID = 0L;
  public ReadOnlyException(String message) {
    super(message);
  }
}

The "list of loans to compare" is represented by an array of Loan objects... Ie: each "loan option" is represented by an instance of the Loan class, which groups all the attributes of a particular loan into one nice tidy "thing" which we can then manipulate as a whole. “要比较的贷款列表”由Loan对象数组表示......即:每个“贷款选项”由Loan class 的一个实例表示,它将特定贷款的所有属性组合成一个整齐的“事物”,然后我们可以将其作为一个整体进行操作。 This a better appraoch than the technique you're using to store loan attributes, which is called "parallel arrays"... and well, umm, it's a bit outdated, in-fact it's got a (greasy) mullet, it's wearing a (too tight) orange safari suit with a (safron pink) head-band... It wasn't a good look in the eighties, and these days, well it's likely to get you beaten-up, arrested, or both;这比您用来存储贷款属性的技术(称为“并行数组”)更好的方法......嗯,嗯,它有点过时了,事实上它有一个(油腻的)鲻鱼,它穿着(太紧)橙色 safari 西装,带(藏红粉色)头带……在 80 年代看起来并不好看,而现在,它很可能会让你被殴打,被捕,或两者兼而有之; depending on your locale... Basically: We have have better ways now!取决于您的语言环境...基本上:我们现在有更好的方法!

The Loan class also has a couple of handy "calculated fields" to do the computations for us. Loan class 也有几个方便的“计算字段”来为我们进行计算。 This means that if the WAY we calculate repayments changes for some reason in future, we only have one place to change it, and everything that uses Loans (which could be reading, writing, permuting, totalling, repossessing, or even wholesaling loans) does NOT have to change... they just pick up the change "for free".这意味着,如果将来我们计算还款的方式因某种原因发生变化,我们只有一个地方可以改变它,而使用贷款的一切(可能是读取、写入、置换、总计、收回甚至批发贷款)确实不必改变......他们只是“免费”获得改变。

In this contrived use-case all our Loans will be for the same ammount, only the interest rates and periods vary... so the Loan class also has a static variable called "principle", which holds THE "common" principle for ALL instances of the Loan class.在这个人为的用例中,我们所有的贷款金额都相同,只是利率和期限不同......所以Loan class 也有一个名为“原则”的static变量,它持有所有实例的“共同”原则贷款 class。 The principle may only be set once.原则只能设置一次。 Any subsequent attempt to set the prinicple will cause a ReadOnlyException to be thrown.任何后续设置原则的尝试都将导致抛出 ReadOnlyException。

Anyway, I hope that you learn something from seeing another way to tackle some of the sub-problems you may have dicovered while doing this exercise yourself.无论如何,我希望你能从另一种方法中学到一些东西,以解决你在自己做这个练习时可能发现的一些子问题。 One tip for the future: Grab your class-mates code for this exercise and read through it... you can learn a LOT from how other people tackle things.对未来的一个提示:为这个练习获取你的同学的代码并通读它......你可以从其他人如何处理事情中学到很多东西。

Cheers.干杯。 Keith.基思。

Now you need to examine the result returned by showMessageDialog() , as shown here .现在您需要检查showMessageDialog()返回的result ,如下所示

String.format("\t \t \t \t \t \n", sellingPrice, ...

That's just going to output 5 tabs.这只是 output 5 个标签。 You want你要

String.format("%s %s %s %s %s %n", sellingPrice, ...
for (int i = 0; i < numberOfLoans; i++)
{
    sb.append(/*...snip...*/ Arrays.toString(annualInterestRatesArray), Arrays.toString(numberOfYearsArray), Arrays.toString(monthlyPaymentArray));
}

You haven't told us what the problem is, but I don't think this bit is doing what you want.你还没有告诉我们问题是什么,但我认为这不是你想要的。 You're asking the program to print out the entirety of your three arrays every time the loop goes round.您要求程序在每次循环时打印出您的三个 arrays 的全部内容。 Instead, you probably want to access the specific array element for each loan, right?相反,您可能想要访问每笔贷款的特定数组元素,对吧? Something like...就像是...

for (int i = 0; i < numberOfLoans; i++)
{
    sb.append(/*...snip...*/ annualInterestRatesArray[i], numberOfYearsArray[i], monthlyPaymentArray[i]);
}

Your JOptionPane.showMessageDialog(null... is inside a for loop. So it will show it as many times as the value of numberOfLoans2. If you dont want that, move your您的JOptionPane.showMessageDialog(null...在 for 循环内。因此它会显示它的次数与 numberOfLoans2 的值一样多。如果您不想要,请移动您的

 String toDisplay = sb.toString();

    JOptionPane.showMessageDialog(null, sb.toString(), toDisplay, JOptionPane.INFORMATION_MESSAGE);

outside the for-loop.在for循环之外。

In your answer printing method the numberOfLoans2 variable is used in two places: in a for loop making the printing happen many times (outer loop) and in a for loop making the mathematic calculation (inner loop).在您的答案打印方法中, numberOfLoans2变量在两个地方使用:在 for 循环中进行多次打印(外循环)和在 for 循环中进行数学计算(内循环)。 Probably the outer one is with no use, so remove it and the result may be shown once.可能外面的那个没用了,所以去掉它,结果可能会显示一次。 Remember to remove the ending } on the end of the loop element to keep the structure ok:)请记住删除循环元素末尾的结尾}以保持结构正常:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM