import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; public class MortgageWindow { public static void main(String args[]) { Frame f = new MyFrame(); f.show(); } } class MyFrame extends Frame implements TextListener { TextField principalField = new TextField("0.00", 15), rateField = new TextField("0.00", 6), yearsField = new TextField("0", 3), paymentField = new TextField("0.00", 15); double principal, rate, ratePercent; int years, n; final int paymentsPerYear = 12; final int timesPerYearCalculated = 12; double effectiveAnnualRate; double payment; public MyFrame() { setTitle("Mortgage Payment Calculator"); setLayout(new GridLayout(4,2)); Label principalLabel = new Label("Principal $"), rateLabel = new Label("Rate (%)"), yearsLabel = new Label("Years"), paymentLabel = new Label("Payment $"); Panel principalLabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)), rateLabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)), yearsLabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)), paymentLabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)); Panel principalFieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)), rateFieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)), yearsFieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)), paymentFieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)); principalLabelPanel.add(principalLabel); principalFieldPanel.add(principalField); rateLabelPanel.add(rateLabel); rateFieldPanel.add(rateField); yearsLabelPanel.add(yearsLabel); yearsFieldPanel.add(yearsField); paymentLabelPanel.add(paymentLabel); paymentFieldPanel.add(paymentField); add(principalLabelPanel); add(principalFieldPanel); add(rateLabelPanel); add(rateFieldPanel); add(yearsLabelPanel); add(yearsFieldPanel); add(paymentLabelPanel); add(paymentFieldPanel); principalField.addTextListener(this); rateField.addTextListener(this); yearsField.addTextListener(this); addWindowListener(new MyAdapter(this)); pack(); show(); } DecimalFormat currency = new DecimalFormat("####0.00"); public void textValueChanged (TextEvent e) { Object source=e.getSource(); if (source == principalField || source == rateField || source == yearsField) { try { principal = Double.parseDouble(principalField.getText()); ratePercent = Double.parseDouble(rateField.getText()); rate = ratePercent/100.0; years = Integer.parseInt(yearsField.getText()); n = paymentsPerYear * years; effectiveAnnualRate = rate / paymentsPerYear; payment = principal*(effectiveAnnualRate / (1 - Math.pow(1 + effectiveAnnualRate, -n))); paymentField.setText(currency.format(payment)); } catch (NumberFormatException ex) {} } } } class MyAdapter extends WindowAdapter { Frame myFrame; MyAdapter(Frame f) { super(); myFrame = f; } public void windowClosing(WindowEvent e) { myFrame.dispose(); } }