Hey guys! I have been working out the kinks in this thing all day and I can't seem to get my Amortization to work. I got everything else to work how I want it. I've double checked all my formulas, and I think it's in the looping. But I'm not sure what to change from here. Could you take a look at it and tell me what you think? Thanks in advance!
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.ActionListe
ner;
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.EmptyBo
rder;
public class MortgageCalculator extends JFrame implements 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.CENT
ER, 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(J
Frame.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().heig
ht));
row1.setBorder( rowborder);
pane.add(row2);
row2.add(principalLabel);
row2.add(principalTxt);
row2.setMaximumSize( new Dimension( 10000, row2.getMinimumSize().heig
ht));
row2.setBorder( rowborder);
pane.add(row3);
row3.add(termLabel);
row3.add(termTxt);
row3.setMaximumSize( new Dimension( 10000, row3.getMinimumSize().heig
ht));
row3.setBorder( rowborder);
pane.add(row4);
row4.add(rateLabel);
row4.add(rateTxt);
row4.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().heig
ht));
row4.setBorder( rowborder);
ButtonGroup bgroup = new ButtonGroup();
bgroup.add(buttonA);
bgroup.add(buttonB);
bgroup.add(buttonC);
radioPanel.setLayout(new FlowLayout(FlowLayout.RIGH
T, 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(monthlyPaymentLab
el);
row5.add(monthlyPaymentTxt
);
monthlyPaymentTxt.setEnabl
ed(false);
//set payment amount uneditable
row5.setMaximumSize( new Dimension( 10000, row5.getMinimumSize().heig
ht));
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().he
ight));
scroll.setBorder(BorderFac
tory.creat
eEmptyBord
er(10,10,1
0,10));
pane.add(scroll);
pane.setLayout(new BoxLayout( pane, BoxLayout.Y_AXIS));
setVisible(true);
setContentPane(pane);
//add listeners
clearButton.addActionListe
ner(this);
exitButton.addActionListen
er(this);
calculateButton.addActionL
istener(th
is);
amortizeButton.addActionLi
stener(thi
s);
buttonA.addActionListener(
this);
buttonB.addActionListener(
this);
buttonC.addActionListener(
this);
}
public void actionPerformed(ActionEven
t event)
{
Object command = event.getSource();
if(command == calculateButton)
{
try
{
principal = Double.parseDouble(princip
alTxt.getT
ext());
}
catch(NumberFormatExceptio
n e)
{
//catch null pointer exception if Principal is null
JOptionPane.showMessageDia
log(null, "Invaild Entry! Please Try Again", "ERROR", JOptionPane.ERROR_MESSAGE)
;
}
try
{
term = Integer.parseInt(termTxt.g
etText());
rate = Double.parseDouble(rateTxt
.getText()
);
}
catch(NumberFormatExceptio
n e)
{
//Set rate and term based on which item in the combobox is selected
if(buttonA.isSelected() == true)
{
rate = 5.35;
term = 7;
}
else if(buttonB.isSelected() == true)
{
rate = 5.5;
term = 15;
}
else if (buttonC.isSelected() == true)
{
rate = 5.75;
term = 30;
}
else
{
//If no button is selected, this is an actual error. Throw an exception
JOptionPane.showMessageDia
log(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)
{
//formatting variables
DecimalFormat df = new DecimalFormat("\u00A4#,##0
.00"); //currency
DecimalFormat pf = new DecimalFormat("#,##0.00%")
; //percentages
DecimalFormat mi = new DecimalFormat("#,##0.000%"
); //percentages
//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
int y = 0; //Counter
//This loop is used to calculate and display the payment schedule information
for(y = 1; y <= notePeriod; y++)
{ //start loop
displayArea.append(""); //Inserts a blank line
//start inner loop
interestPaid = principalBalance * interest;
monthlyPrincipal = monthlyPayment - interestPaid;
loanBalance = loanBalance - monthlyPayment;
principalBalance = principalBalance - monthlyPrincipal;
displayArea.append("Month "+y+"\t\t"+df.format(month
lyPrincipa
l)+"\t\t"
+df.format(interestPaid)+"
\t\t"+df.f
ormat(prin
cipalBalan
ce)+"\n");
displayArea.setCaretPositi
on(0);
}
}
}
public static void main (String[] arguments) //Main Method
{
MortgageCalculator smc = new MortgageCalculator();
smc.setVisible(true);
smc.setDefaultCloseOperati
on(JFrame.
EXIT_ON_CL
OSE);
}
} //End of program