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.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;
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.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);
}
public void 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;
}
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.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)
{
//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(monthlyPrincipal)+"\t\t"
+df.format(interestPaid)+"\t\t"+df.format(principalBalance)+"\n");
displayArea.setCaretPosition(0);
}
}
}
public static void main (String[] arguments) //Main Method
{
MortgageCalculator smc = new MortgageCalculator();
smc.setVisible(true);
smc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} //End of program
by: rhivkaPosted on 2007-07-16 at 18:56:25ID: 19501648
I've gotten a little further on the Amortization...but the calculations still aren't coming out right. I'd really appreciate if someone could show me where I'm going wrong. This is what I have now for that area:
alance\n";
);
.00"); //currency ; //percentages ); //percentages
on(0); r +1) + ")\t"+df.format(monthlyPri ncipal)+"\ t\t" \t\t"+df.f ormat(prin cipalBalan ce)+"\n");
.00"); //currency ; //percentages ); //percentages
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\tB
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
DecimalFormat pf = new DecimalFormat("#,##0.00%")
DecimalFormat mi = new DecimalFormat("#,##0.000%"
displayArea.setCaretPositi
displayArea.append((counte
+df.format(interestPaid)+"
}
//formatting variables
DecimalFormat df = new DecimalFormat("\u00A4#,##0
DecimalFormat pf = new DecimalFormat("#,##0.00%")
DecimalFormat mi = new DecimalFormat("#,##0.000%"
}