Problem with Amortization
Hey guys... I'm sure you've seen this mortgage calculator til you're just sick of it. But I'm having a problem and I just can't get it to work. Could you please take a look at my code and see if you can find what I'm missing. The program is compiling fine, runs fine except the calculations for the Amortization are wrong somewhere. It prints but the figures are all wrong. Thanks for your help!
(I apologize if the spacing is off, I tried to clean it up)
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
publicclass MortgageCalculatorextends JFrameimplements ActionListener{
int term = 0;
double principal = 0;
double rate = 0;
double monthlyPayment = 0;
double interest = 0;
int notePeriod = 0;
String mTerm[] ={"7","15","30"};
String mInterst[] ={"5.35","5.50","5.75"};
JPanel row1 =new JPanel();
JLabel mortgageLabel =new JLabel("MORTGAGE PAYMENT CALCULATOR", JLabel.CENTER);
JPanel row2 =new JPanel(new GridLayout(1, 2));
JLabel principalLabel =new JLabel("Mortgage Principal $",JLabel.LEFT);
JTextField principalTxt =new JTextField(10);
JPanel row3 =new JPanel(new GridLayout(1, 2));
JLabel termLabel =new JLabel("Mortgage Term (Yrs)",JLabel.LEFT);
JTextField termTxt =new JTextField(10);
JPanel row4 =new JPanel(new GridLayout(1, 2));
JLabel rateLabel =new JLabel("Interest Rate (%)", JLabel.LEFT);
JTextField rateTxt =new JTextField(10);
JPanel radioPanel =new JPanel();
JRadioButton buttonA =new JRadioButton("7 Years at 5.35%" ,false);
JRadioButton buttonB =new JRadioButton("15 Years at 5.50%" ,false);
JRadioButton buttonC =new JRadioButton("30 Years at 5.75%",false);
JPanel row5 =new JPanel(new GridLayout(1, 2));
JLabel monthlyPaymentLabel =new JLabel("Monthly Payment $", JLabel.LEFT);
JTextField monthlyPaymentTxt =new JTextField(10);
//create buttons
JPanel button =new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
JButton amortizeButton =new JButton("Amortize Payments");
JButton clearButton =new JButton("Clear");
JButton exitButton =new JButton("Exit");
JButton calculateButton =new JButton("Calculate");
//create textarea to diplay payments
JTextArea displayArea =new JTextArea(10, 45);
JScrollPane scroll =new JScrollPane(displayArea);
public MortgageCalculator()
{
super ("Mortgage Payment Calculator by S Kemen");
setSize(550, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = getContentPane();
Border rowborder =new EmptyBorder( 3, 10, 3, 10 );
pane.add(row1);
row1.add(mortgageLabel);
row1.setMaximumSize(new Dimension( 10000, row1.getMinimumSize().height));
row1.setBorder( rowborder);
pane.add(row2);
row2.add(principalLabel);
row2.add(principalTxt);
row2.setMaximumSize(new Dimension( 10000, row2.getMinimumSize().height));
row2.setBorder( rowborder);
pane.add(row3);
row3.add(termLabel);
row3.add(termTxt);
row3.setMaximumSize(new Dimension( 10000, row3.getMinimumSize().height));
row3.setBorder( rowborder);
pane.add(row4);
row4.add(rateLabel);
row4.add(rateTxt);
row4.setMaximumSize(new Dimension( 10000, row4.getMinimumSize().height));
row4.setBorder( rowborder);
ButtonGroup bgroup =new ButtonGroup();
bgroup.add(buttonA);
bgroup.add(buttonB);
bgroup.add(buttonC);
radioPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 4, 4 ));
radioPanel.add(buttonA);
radioPanel.add(buttonB);
radioPanel.add(buttonC);
pane.add(radioPanel);
radioPanel.setMaximumSize(new Dimension( 10000, radioPanel.getMinimumSize().height));
radioPanel.setBorder( rowborder);
pane.add(row5);
row5.add(monthlyPaymentLabel);
row5.add(monthlyPaymentTxt);
monthlyPaymentTxt.setEnabled(false);//set payment amount uneditable
row5.setMaximumSize(new Dimension( 10000, row5.getMinimumSize().height));
row5.setBorder( rowborder);
button.add(calculateButton);
button.add(clearButton);
button.add(exitButton);
button.add(amortizeButton);
pane.add(button);
button.setMaximumSize(new Dimension( 10000, button.getMinimumSize().height));
scroll.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
pane.add(scroll);
pane.setLayout(new BoxLayout( pane, BoxLayout.Y_AXIS));
setVisible(true);
setContentPane(pane);
//add listeners
clearButton.addActionListener(this);
exitButton.addActionListener(this);
calculateButton.addActionListener(this);
amortizeButton.addActionListener(this);
buttonA.addActionListener(this);
buttonB.addActionListener(this);
buttonC.addActionListener(this);
}
publicvoid actionPerformed(ActionEvent event)
{
Object command = event.getSource();
if(command == calculateButton)
{
try
{
principal = Double.parseDouble(principalTxt.getText());
}
catch(NumberFormatException e)
{
//catch null pointer exception if Principal is null
JOptionPane.showMessageDialog(null,"Invaild Entry! Please Try Again","ERROR", JOptionPane.ERROR_MESSAGE);
}
try
{
term = Integer.parseInt(termTxt.getText());
rate = Double.parseDouble(rateTxt.getText());
}
catch(NumberFormatException e)
{
//Set rate and term based on which item in the combobox is selected
if(buttonA.isSelected() ==true)
{
rate = 5.35;
term = 7;
}
elseif(buttonB.isSelected() ==true)
{
rate = 5.5;
term = 15;
}
elseif (buttonC.isSelected() ==true)
{
rate = 5.75;
term = 30;
}
else
{
//If no button is selected, this is an actual error. Throw an exception
JOptionPane.showMessageDialog(null,"Invaild Entry! Please Try Again","ERROR", JOptionPane.ERROR_MESSAGE);
}
}
double interest = rate / 100 / 12;//Monthly interst rate
double notePeriod= term * 12;//Number of months over which loan is amortized
//calculation formula
double monthlyPayment = (principal * interest) / (1 - Math.pow(1 + interest, -notePeriod));
//formatting variables
DecimalFormat df =new DecimalFormat("\u00A4#,##0.00");//currency
DecimalFormat pf =new DecimalFormat("#,##0.00%");//percentages
DecimalFormat mi =new DecimalFormat("#,##0.000%");//percentages
monthlyPaymentTxt.setText("" + df.format(monthlyPayment));
}
if(command == clearButton)
{
principalTxt.setText(null);
monthlyPaymentTxt.setText(null);
displayArea.setText(null);
}
if(command == exitButton)
{
System.exit(0);
}
if (command == amortizeButton)
{
//Amoritization variables
double loanBalance = notePeriod * monthlyPayment;
double interestPaid = 0;//Amount of interest paid on the loan
double monthlyPrincipal = 0;//Amount of principal in each monthly payment
double principalBalance = principal;//runing total of principal after payment
String titles ="Month\t Principal\t\tInterest\t\tBalance\n";
displayArea.setText(titles);
displayArea.append("");//Inserts a blank line
//This loop is used to calculate and display the payment schedule information
for(int counter = 0; counter <= term * 12 - 0; counter++)
{
//start outer loop
if(interestPaid == 0)//start inner loop
interestPaid = principalBalance * interest;monthlyPrincipal = monthlyPayment - interestPaid;
loanBalance = loanBalance - monthlyPayment;
principalBalance = principalBalance - monthlyPrincipal;
//formatting variables
DecimalFormat df =new DecimalFormat("\u00A4#,##0.00");//currency
DecimalFormat pf =new DecimalFormat("#,##0.00%");//percentages
DecimalFormat mi =new DecimalFormat("#,##0.000%");//percentages
displayArea.setCaretPosition(0);
displayArea.append((counter +1) +")\t"+df.format(monthlyPrincipal)+"\t\t"+df.format(interestPaid)+"\t\t"+df.format(principalBalance)+"\n");
}
}
}
publicstaticvoid main (String[] arguments)//Main Method
{
MortgageCalculator smc =new MortgageCalculator();
smc.setVisible(true);
smc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}//End of program

