# 3
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.math.*;
import java.text.NumberFormat;
public class Mortgage extends JFrame implements ActionListener
{
JPanel amountPanel = new JPanel();
JPanel ratePanel = new JPanel();
JPanel termPanel = new JPanel();
JPanel paymentPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JPanel buttonAmortPanel = new JPanel();
JPanel amortTablePanel = new JPanel();
JLabel lAmount = new JLabel("Enter Amount:");
JLabel lRate = new JLabel("Enter Rate:");
JLabel lTerm = new JLabel("Enter Term:");
JLabel lPayment = new JLabel("Monthly Payment Is:");
JLabel lPaymentAmt = new JLabel("");
JLabel lEmpty = new JLabel("");
JTextField tAmount = new JTextField(10);
JTextField tRate = new JTextField(8);
JTextField tTerm = new JTextField(8);
JButton bCalc = new JButton("Calculate");
JButton bClear = new JButton("Clear");
JButton bExit = new JButton("Exit");
JButton bAmort = new JButton("Amortization Table");
JScrollPane scrollPane = new JScrollPane();
//New instance of NumberFormat
NumberFormat currency = NumberFormat.getCurrencyInstance();
//Used to calculate
double dAmount;
double dRate;
int iTerm;
double dPayment;
void buildGUI()
{
getContentPane().setLayout(new FlowLayout());
lPaymentAmt.setBorder(BorderFactory.createLineBorder(Color.black));
lPaymentAmt.setPreferredSize(new Dimension(200, 30));
lPaymentAmt.setFont(new Font("Arial", 20, 20));
lEmpty.setPreferredSize(new Dimension(60, 30));
bCalc.setPreferredSize(new Dimension(200, 30));
bAmort.setPreferredSize(new Dimension(290, 30));
amountPanel.add(lAmount);
amountPanel.add(tAmount);
ratePanel.add(lRate);
ratePanel.add(tRate);
termPanel.add(lTerm);
termPanel.add(tTerm);
paymentPanel.add(lPayment);
paymentPanel.add(lPaymentAmt);
paymentPanel.add(lEmpty);
bCalc.addActionListener(this);
bClear.addActionListener(this);
bExit.addActionListener(this);
bAmort.addActionListener(this);
buttonPanel.add(bClear);
buttonPanel.add(bCalc);
buttonPanel.add(bExit);
buttonAmortPanel.add(bAmort);
getContentPane().add(amountPanel);
getContentPane().add(ratePanel);
getContentPane().add(termPanel);
getContentPane().add(paymentPanel);
getContentPane().add(buttonPanel);
getContentPane().add(buttonAmortPanel);
setTitle("Mortgage Calculator");
setSize(600, 220);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} //end buildGUI
//Method to calculate monthly payment
void getPayment(double dAmount, double dRate, int iTerm)
{
dPayment = (dAmount * (dRate / 1200)) / (1-Math.pow(1 / (1+dRate / 1200)
, (iTerm * 12)));
lPaymentAmt.setText(currency.format(dPayment));
}
void getAmortTable()
{
//recalculate payment before creating amortization table
if (lPaymentAmt.getText() != "")
{
//convert user-entered amounts
dAmount = Double.valueOf(tAmount.getText());
dRate = Double.valueOf(tRate.getText());
iTerm = Integer.parseInt(tTerm.getText());
//variable to calculate amortTable
int iCounter;
int iPayment = iTerm * 12;
double dMonthlyRate = dRate / 1200;
double dTotalInterest = 0;
double dInterestPaid = 0;
double dPrincipalPaid = 0;
double dBalance = 0;
setSize(600, 600);
//arrays for amortTable
String[] colNames =
{
"Month", "Payment", "Principal Paid", "Interest Paid", "Balance"
};
String[][] data = new String[iPayment][5];
//calculate amortization table and fill array with results
for (iCounter = 0; iCounter < iPayment; iCounter++)
{
//Calculate
dInterestPaid = dAmount * dMonthlyRate;
dPrincipalPaid = dPayment - dInterestPaid;
dBalance = dAmount - dPrincipalPaid;
dAmount = dBalance;
dTotalInterest += dInterestPaid;
for (int colCounter = 0; colCounter < 5; colCounter++)
{
int dataCounter = 0;
data[iCounter][dataCounter] = Integer.toString(iCounter + 1)
;
data[iCounter][dataCounter + 1] = ("" + currency.format
(dPayment));
data[iCounter][dataCounter + 2] = ("" + currency.format
(dInterestPaid));
data[iCounter][dataCounter + 3] = ("" + currency.format
(dPrincipalPaid));
data[iCounter][dataCounter + 4] = ("" + currency.format
(dBalance));
} //end for
} //end for
//create JTable and fill with arrays
JTable amortTable = new JTable(data, colNames);
JScrollPane scrollPane = new JScrollPane(amortTable);
//add JTable to scrollpane
scrollPane.setPreferredSize(new Dimension(500, 370));
//set size of scrollpane
amortTablePanel.add(scrollPane);
getContentPane().add(amortTablePanel);
amortTablePanel.repaint();
} //end if
else
{
try
{
getPayment(Double.valueOf(tAmount.getText()), Double.valueOf
(tRate.getText()), Integer.parseInt(tTerm.getText()));
getAmortTable();
}
catch (Exception error)
{
JOptionPane.showMessageDialog(null,
"Invalid Input. Please Try Again.", "Input Error",
JOptionPane.ERROR_MESSAGE);
}
} //end else
} //end getAmortTable
void setClearGUI()
{
getContentPane().remove(amortTablePanel);
getContentPane().repaint();
tAmount.setText("");
tRate.setText("");
tTerm.setText("");
lPaymentAmt.setText("");
tAmount.requestFocus();
//setSize(600, 220);
}
public void actionPerformed(ActionEvent onClick)
{
Object src = onClick.getSource();
if (src == bCalc)
{
try
{
getPayment(Double.valueOf(tAmount.getText()), Double.valueOf
(tRate.getText()), Integer.parseInt(tTerm.getText()));
}
catch (Exception error)
{
JOptionPane.showMessageDialog(null,
"Invalid Input. Please Try Again.", "Input Error",
JOptionPane.ERROR_MESSAGE);
}
}
if (src == bClear)
{
setClearGUI();
} //end if bClear
if (src == bAmort)
{
getAmortTable();
} //end if bAmort
if (src == bExit)
{
System.exit(1);
} //end if bExit
} //end actionPerformed
public static void main(String[] args)
{
new Mortgage().buildGUI();
}
} //end Mortgage