Вывод Java JOptionPane - PullRequest
       14

Вывод Java JOptionPane

1 голос
/ 11 июня 2011

Может кто-нибудь сказать мне, что я здесь делаю не так. Мне нужно вычислить некоторые значения из пользовательского ввода в некоторые диалоговые окна JOptionPane-input-input, а затем вывести ответы.

Буду очень признателен за любую помощь. Заранее спасибо!

  1. Input
    • Количество кредитов для сравнения (может быть больше 1)
    • Цена продажи
    • Первоначальный взнос
    • Вы будете просить следующее по каждому кредиту, который они хотят сравнить
      • Процентная ставка
      • Количество лет
  2. Обработка
    • Вам нужно будет рассчитать ежемесячный платеж для каждого сценария, указанного в части d, для данных процентных ставок и количества лет.
  3. Выход
    • Цена продажи
    • Авансовый платеж
    • Сумма кредита
    • Список для каждого сценария
      • проценты
      • года
      • оплата

Вот мой код:

    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);             
          }
     }

Ответы [ 6 ]

2 голосов
/ 11 июня 2011

Если бы я был вынужден, по-видимому, большим зеленым и особенно уродливым троллем, маскирующимся под учителя программирования, использовать несколько панелей JOption для ввода и вывода, то вот как я бы решил эту проблему.Это предназначено только для вашей информации ... если вы сдадите это как свою собственную работу, ваш учитель почувствует запах крысы, и у троллей тоже есть гугл.

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);
  }
}

"Список кредитов для сравнения"представленный массивом Loan объектов ... Т.е.: каждый «вариант ссуды» представлен экземпляром класса Loan, который группирует все атрибуты определенного ссуды в одну симпатичную «вещь», которую мы можемзатем манипулировать в целом.Это лучшая оценка, чем метод, который вы используете для хранения атрибутов ссуды, который называется «параллельные массивы» ... и, ну, ну, он немного устарел, на самом деле у него есть (жирный) кефаль, на нем надето(слишком обтягивающий) оранжевый костюм для сафари с (сафрон-розовой) повязкой на голову ... В восьмидесятых это было не очень хорошо выглядеть, и в наши дни, вполне вероятно, вас избьют, арестуют или оба;в зависимости от вашей локали ... По сути: у нас есть лучшие способы сейчас!

В классе Loan также есть пара удобных "вычисляемых полей", чтобы выполнять вычисления для нас.Это означает, что если СПОСОБ, которым мы рассчитываем изменения выплат по какой-либо причине в будущем, у нас есть только одно место, чтобы изменить его, и все, что использует займы (которые могут быть чтением, письмом, перестановкой, суммированием, повторным владением или даже оптовыми займами)НЕ нужно менять ... они просто получают изменения "бесплатно".

В этом надуманном сценарии использования все наши кредиты будут на одну и ту же сумму, меняются только процентные ставки и периоды ...поэтому класс Loan также имеет переменную static, называемую «принцип», которая содержит «общий» принцип для ВСЕХ экземпляров класса Loan.Принцип может быть установлен только один раз.Любая последующая попытка установить этот принцип приведет к возникновению исключения ReadOnlyException.

В любом случае, я надеюсь, что вы узнаете что-то из другого способа решения некоторых из подзадач, которые вы могли решить, выполняя это упражнение самостоятельно.,Один совет на будущее: возьмите свой код одноклассников для этого упражнения и прочитайте его ... вы можете узнать много из того, как другие люди решают проблемы.

Приветствия.Кит.

1 голос
/ 13 июня 2011

Ваш JOptionPane.showMessageDialog(null... находится внутри цикла for. Таким образом, он будет показывать столько же раз, сколько и значение numberOfLoans2. Если вы этого не хотите, переместите

 String toDisplay = sb.toString();

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

вне цикла for.

1 голос
/ 11 июня 2011
for (int i = 0; i < numberOfLoans; i++)
{
    sb.append(/*...snip...*/ Arrays.toString(annualInterestRatesArray), Arrays.toString(numberOfYearsArray), Arrays.toString(monthlyPaymentArray));
}

Вы не сказали нам, в чем проблема, но я не думаю, что этот бит делает то, что вы хотите.Вы просите программу распечатать все ваши три массива каждый раз, когда цикл повторяется.Вместо этого вы, вероятно, хотите получить доступ к конкретному элементу массива для каждого кредита, верно?Что-то вроде ...

for (int i = 0; i < numberOfLoans; i++)
{
    sb.append(/*...snip...*/ annualInterestRatesArray[i], numberOfYearsArray[i], monthlyPaymentArray[i]);
}
1 голос
/ 11 июня 2011
String.format("\t \t \t \t \t \n", sellingPrice, ...

Вот только выйдет 5 вкладок.Вы хотите

String.format("%s %s %s %s %s %n", sellingPrice, ...
1 голос
/ 11 июня 2011

Теперь вам нужно проверить result, возвращаемое showMessageDialog(), как показано здесь .

0 голосов
/ 13 июня 2011

В вашем методе печати ответа переменная numberOfLoans2 используется в двух местах: в цикле for печать выполняется много раз (внешний цикл) и в цикле for выполняется математический расчет (внутренний цикл). Вероятно, внешний бесполезен, поэтому удалите его, и результат может быть показан один раз. Не забудьте удалить окончание } в конце элемента цикла, чтобы сохранить структуру в порядке:)

...