|
|
Welcome to the Java Forums.
You are currently viewing our boards as a guest which gives you limited access to view most discussions and access our other features. By joining our free community, you will:
- have access to post topics
- communicate privately with other members (PM)
- not see advertisements between posts
- have the possibility to earn one of our surprises if you are an active member
- access many other special features that will be introduced later.
Registration is fast, simple and absolutely free so please, join our community today!
If you have any problems with the registration process or your account login, please contact us.
|
|

07-30-2007, 12:48 AM
|
|
Member
|
|
Join Date: Jul 2007
Posts: 11
|
|
|
Problem with Sequential File and Arrays
Hey guys! I'm new to this forum, but I am desperately needing some help with this program. I normally post to Experts-Exchange but I'm getting no help there. I'm afraid I'm in over my head with this one. I've been working on this a few days now and I just can't get it working. I've tried to clean it up and separate the logic from the UI (I know you Java guru's hate when it's not seperate)...but any changes in these areas throw up more errors so I apologize if my code is a mess. The program is a mortgage calculator that should read the interest rates and terms for the arrays from an external text file. Then add a graph that displays the change in principal balance over the life of the loan.
Maybe I'm making it into a lot more than it is...but any help to clean up this mess would be greatly appreciated!
import java.awt.*;
import java.awt.Component;
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 java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.MessageFormat;
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;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Wk5SunniMortgageCalculator extends JFrame implements ActionListener {
int term = 0;
double principal = 0;
double rate = 0;
double monthlyPayment = 0;
double interest = 0;
int notePeriod = 0;
int[] termArray;
double[] rateArray;
private float[] monthlyPrincipal;
private float[] interestPaid;
//reading from sequential file
public void load()
{
Reader fis;
try
{
fis = new InputStreamReader(getClass().getResourceAsStream("data.txt"));
BufferedReader b = new BufferedReader( fis );
String[] line = b.readLine( ).split(",");
termArray = new int[line.length];
for ( int i = 0; i < line.length; i++ )
{
termArray[ i ] = Integer.parseInt(line[i].trim());
}
line = b.readLine( ).split(",");
rateArray = new double[line.length];
for ( int i = 0; i < line.length; i++ )
{
rateArray[ i ] = Double.parseDouble(line[i].trim());
}
b.close();
fis.close();
}
catch ( Exception e1 )
{
e1.printStackTrace( );
}
}
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 row5 = new JPanel(new GridLayout(1, 2));
JLabel presetLabel = new JLabel("Preset Term and Interest Rate:", JLabel.LEFT);
JPanel row6 = new JPanel();
JComboBox choices = new;
JComboBox();
MessageFormat mf = new MessageFormat("{0} years at {1,number,#.##}%");
JLabel choiceLabel = new JLabel(" (choose rate)");
for (int i = 0; i < termArray.length; i++)
{
options.addItem(mf.format(new Object[] { new Integer(termArray [i]), new Double(rateArray[i])}));
}
JPanel row6 = 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 graphButton = new JButton("Display Graph");
JButton amortizeButton = new JButton("Amortize Payments");
JButton clearButton = new JButton("Clear");
JButton exitButton = new JButton("Exit");
JButton calculateButton = new JButton("Calculate");
//create textarea to display Amortize output
JTextArea displayArea = new JTextArea(10, 45);
JScrollPane scroll = new JScrollPane(displayArea);
public Wk5SunniMortgageCalculator()
{
super ("Mortgage Payment Calculator by S Kemen");
setSize(550, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = getContentPane();
}
public void init()
{
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);
pane.add(row5);
row5.add(presetLabel);
row5.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().height));
row5.setBorder( rowborder);
pane.add(row6);
row6.add(choiceLabel);
row6.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().height));
row6.setBorder( rowborder);
radioPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 4, 4 ));
radioPanel.add(choices);
pane.add(radioPanel);
radioPanel.setMaximumSize( new Dimension( 10000, radioPanel.getMinimumSize().height));
radioPanel.setBorder( rowborder);
pane.add(row7);
row7.add(monthlyPaymentLabel);
row7.add(monthlyPaymentTxt);
monthlyPaymentTxt.setEnabled(false); //set payment amount uneditable
row7.setMaximumSize( new Dimension( 10000, row5.getMinimumSize().height));
row7.setBorder( rowborder);
//Add buttons
button.add(calculateButton);
button.add(clearButton);
button.add(exitButton);
button.add(amortizeButton);
button.add(graphButton);
pane.add(button);
button.setMaximumSize( new Dimension( 10000, button.getMinimumSize().height));
//scroll text pane for Amortize output
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 for buttons and combo box
choice.addActionListener(this);
clearButton.addActionListener(this);
exitButton.addActionListener(this);
calculateButton.addActionListener(this);
amortizeButton.addActionListener(this);
graphButton.addActionListener(this);
}
private JFrame mFrame = null;
public void actionPerformed(ActionEvent event)
{
Object command = event.getSource();
if(command == calculateButton) //function for Calculate button
{
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
{
//Get input from Term text box, checked first before combo box
term = Integer.parseInt(termTxt.getText());
rate = Double.parseDouble(rateTxt.getText()); //Input from Rate text box
}
//If Term and Rate are null, buttons are checked for input values
catch(NumberFormatException e)
{
//Set rate and term based on which item in the combobox is selected
//Still have to fill in this area for the combo box arrays
if
else
{
//If no option is selected and combo box null, this is an actual error.
JOptionPane.showMessageDialog(null, "Invaild Entry! Please Try Again", "ERROR", JOptionPane.ERROR_MESSAGE);
}
}
interest = rate / 100 / 12; //Monthly interst rate
notePeriod= term * 12; //Number of months over which loan is amortized
//calculation formula
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) //Function for Clear button
{
principalTxt.setText(null);
monthlyPaymentTxt.setText(null);
rateTxt.setText(null);
termTxt.setText(null);
displayArea.setText(null);
}
if(command == exitButton) //Function for Exit button
{
System.exit(0);
}
if (command == amortizeButton) //Function for Amortize button
{
//Amoritization variables
double loanBalance = notePeriod * monthlyPayment;
double interestPaid = 0; //Interest paid on the loan
double monthlyPrincipal = 0; //Principal in each monthly payment
double principalBalance = principal; //running total of principal after payment
String titles = "Month\t Principal\t\tInterest\t\tBalance\n"; //String for output
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
{
//start inner loop
nterestPaid = 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
//formatting for output
displayArea.setCaretPosition(0);
displayArea.append((counter +1) + ")\t"+df.format(monthlyPrincipal)+"\t\t"
+df.format(interestPaid)+"\t\t"+df.format(principalBalance)+"\n");
}
}
if (command == graphButton) //Function for Graph button
{
mFrame = new JFrame("Mortgage Payment Graph");
mFrame.getContentPane().add(new GraphPanel(monthlyPrincipal, interestPaid));
mFrame.setSize(800,600);
mFrame.setLocation(200,100);
}
}
class GraphPanel extends JPanel
{
final int
HPAD = 60,
VPAD = 40;
int[] data;
float[] principleData;
float[] interestData;
public GraphPanel(float[] p, float[] i)
{
principleData = p;
interestData = i;
font = new Font("lucida sans regular", Font.PLAIN, 16);
setBackground(Color.white);
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
FontRenderContext frc = g2.getFontRenderContext();
int w = getWidth();
int h = getHeight();
// scales
float xInc = (w - HPAD - VPAD) / (interestData.length - 1);//11f; //distance between each plot
float yInc = (h - 2*VPAD) / 10f;
int[] dataVals = getDataVals(); //min and max values for y-axis
float yScale = dataVals[2] / 10f;
// ordinate (y - axis)
g2.draw(new Line2D.Double(HPAD, VPAD, HPAD, h - VPAD));
// plot tic marks
float x1 = HPAD, y1 = VPAD, x2 = HPAD - 3, y2;
for(int j = 0; j < 10; j++)
{
g2.draw(new Line2D.Double(x1, y1, x2, y1));
y1 += yInc;
}
// labels
String text; LineMetrics lm;
float xs, ys, textWidth, height;
for(int j = 0; j <= 10; j++)
{
text = String.valueOf(dataVals[1] - (int)(j * yScale));
textWidth = (float)font.getStringBounds(text, frc).getWidth();
lm = font.getLineMetrics(text, frc);
height = lm.getAscent();
xs = HPAD - textWidth - 7;
ys = VPAD + (j * yInc) + height/2;
g2.drawString(text, xs, ys);
if(j == 0) g2.drawString("Principal", xs, ys - 15);
}
// abcissa (x - axis)
g2.draw(new Line2D.Double(HPAD, h - VPAD, w - VPAD, h - VPAD));
// tic marks
x1 = HPAD; y1 = h - VPAD; y2 = y1 + 3;
for(int j = 0; j < interestData.length; j++)
{
g2.draw(new Line2D.Double(x1, y1, x1, y2));
x1 += xInc;
}
// labels
ys = h - VPAD;
for(int j = 0; j < interestData.length; j++)
{
text = String.valueOf(j + 1);
textWidth = (float)font.getStringBounds(text, frc).getWidth();
lm = font.getLineMetrics(text, frc);
height = lm.getHeight();
xs = HPAD + j * xInc - textWidth/2;
g2.drawString(text, xs, ys + height);
if( j == (interestData.length - 1)) g2.drawString("Year", (int)w /2 , ys + height + 15);
}
// plot data
float yy2 = 0, yy1 = 0, xx2 = 0, xx1;
x1 = HPAD;
xx1 = HPAD;
yScale = (float)(h - 2*VPAD) / dataVals[2];
for(int j = 0; j < interestData.length; j++)
{
g.setColor(Color.blue);
y1 = VPAD + (h - 2*VPAD) - (principalData[j] - dataVals[0]) * yScale;
g2.fillOval((int)x1, (int)y1 - 2, 5, 5);
if(j > 0)
g2.draw(new Line2D.Double(x1, y1, x2, y2));
x2 = x1;
y2 = y1;
x1 += xInc;
g.setColor(Color.red);
yy1 = VPAD + (h - 2*VPAD) - (interestData[j] - dataVals[0]) * yScale;
g2.fillOval((int)xx1, (int)yy1 - 1, 5, 5);
if(j > 0)
g2.draw(new Line2D.Double(xx1, yy1, xx2, yy2));
xx2 = xx1;
yy2 = yy1;
xx1 += xInc;
}
}
private int[] getDataVals()
{
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int j = interestData.length -1;
max = (int)principleData[j];
min = (int)interestData[j];
int span = max - min;
return new int[] { min, max, span };
}
}
public static void main (String[] arguments) //Main Method
{
Wk5SunniMortgageCalculator smc = new Wk5SunniMortgageCalculator();
smc.setVisible(true);
smc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} //End of program
The external file (data.txt) contains the following:
7,5.35
15,5.5
20,5.65
30,5.75
Feel free to criticize or offer advice  Thank you!
|
|

07-30-2007, 03:51 AM
|
|
Senior Member
|
|
Join Date: Jul 2007
Posts: 1,222
|
|
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.io.*;
import java.text.*;
import java.util.Locale;
import javax.swing.*;
import javax.swing.border.*;
public class MC extends JFrame implements ActionListener {
JTextField principalTxt, termTxt, rateTxt, monthlyPaymentTxt;
JTextArea displayArea;
JButton calculateButton, graphButton, amortizeButton, clearButton, exitButton;
JComboBox options;
// Can these 6 be removed and declared as local variables?
int term = 0;
double principal = 0;
double rate = 0;
double monthlyPayment = 0;
double interest = 0;
int notePeriod = 0;
int[] termArray;
double[] rateArray;
private float[] monthlyPrincipal;
private float[] interestPaid;
public MC() {
super ("Mortgage Payment Calculator by S Kemen");
load();
// Initialize components.
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);
principalTxt = new JTextField(10);
JPanel row3 = new JPanel(new GridLayout(1, 2));
JLabel termLabel = new JLabel("Mortgage Term (Yrs)",JLabel.LEFT);
termTxt = new JTextField(10);
JPanel row4 = new JPanel(new GridLayout(1, 2));
JLabel rateLabel = new JLabel("Interest Rate (%)", JLabel.LEFT);
rateTxt = new JTextField(10);
JPanel row5 = new JPanel(new GridLayout(1, 2));
JLabel presetLabel = new JLabel("Preset Term and Interest Rate:", JLabel.LEFT);
// JPanel row6 = new JPanel();
// JComboBox choices = new JComboBox();
options = new JComboBox();
MessageFormat mf = new MessageFormat("{0} years at {1,number,#.##}%");
JLabel choiceLabel = new JLabel(" (choose rate)");
for (int i = 0; i < termArray.length; i++) {
options.addItem(mf.format(new Object[] { new Integer(termArray [i]),
new Double(rateArray[i])}));
}
JPanel row6 = new JPanel(new GridLayout(1, 2));
JLabel monthlyPaymentLabel = new JLabel("Monthly Payment $", JLabel.LEFT);
monthlyPaymentTxt = new JTextField(10);
//create buttons
JPanel button = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
graphButton = new JButton("Display Graph");
amortizeButton = new JButton("Amortize Payments");
clearButton = new JButton("Clear");
exitButton = new JButton("Exit");
calculateButton = new JButton("Calculate");
//create textarea to display Amortize output
displayArea = new JTextArea(10, 45);
JScrollPane scroll = new JScrollPane(displayArea);
Container pane = getContentPane();
// Set layout before adding components.
pane.setLayout(new BoxLayout( pane, BoxLayout.Y_AXIS));
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);
pane.add(row5);
row5.add(presetLabel);
row5.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().height));
row5.setBorder( rowborder);
pane.add(row6);
row6.add(choiceLabel);
row6.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().height));
row6.setBorder( rowborder);
// Left this out
JPanel radioPanel = new JPanel();
radioPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 4, 4 ));
// radioPanel.add(choices);
radioPanel.add(options);
pane.add(radioPanel);
radioPanel.setMaximumSize( new Dimension( 10000,
radioPanel.getMinimumSize().height));
radioPanel.setBorder( rowborder);
// Left this out
JPanel row7 = new JPanel();
pane.add(row7);
row7.add(monthlyPaymentLabel);
row7.add(monthlyPaymentTxt);
monthlyPaymentTxt.setEnabled(false); //set payment amount uneditable
row7.setMaximumSize( new Dimension( 10000, row5.getMinimumSize().height));
row7.setBorder( rowborder);
//Add buttons
button.add(calculateButton);
button.add(clearButton);
button.add(exitButton);
button.add(amortizeButton);
button.add(graphButton);
pane.add(button);
button.setMaximumSize( new Dimension( 10000, button.getMinimumSize().height));
//scroll text pane for Amortize output
scroll.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
pane.add(scroll);
setContentPane(pane);
//add listeners for buttons and combo box
// choice.addActionListener(this);
options.addActionListener(this);
clearButton.addActionListener(this);
exitButton.addActionListener(this);
calculateButton.addActionListener(this);
amortizeButton.addActionListener(this);
graphButton.addActionListener(this);
// Keep JFrame method together.
setSize(550, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent event) {
Object command = event.getSource();
if(command == calculateButton) { //function for Calculate button
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 {
//Get input from Term text box, checked first before combo box
term = Integer.parseInt(termTxt.getText());
rate = Double.parseDouble(rateTxt.getText()); //Input from Rate text box
} catch(NumberFormatException e) {
//If Term and Rate are null, buttons are checked for input values
//Set rate and term based on which item in the combobox is selected
//Still have to fill in this area for the combo box arrays
/*
if
else {
//If no option is selected and combo box null,
// this is an actual error.
JOptionPane.showMessageDialog(null, "Invaild Entry! " +
"Please Try Again",
"ERROR", JOptionPane.ERROR_MESSAGE);
}
*/
}
interest = rate / 100 / 12; //Monthly interst rate
notePeriod= term * 12; //Number of months over which loan is amortized
//calculation formula
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) { //Function for Clear button
principalTxt.setText(null);
monthlyPaymentTxt.setText(null);
rateTxt.setText(null);
termTxt.setText(null);
displayArea.setText(null);
}
if(command == exitButton) { //Function for Exit button
System.exit(0);
}
if (command == amortizeButton) { //Function for Amortize button
//Amoritization variables
double loanBalance = notePeriod * monthlyPayment;
// You need to use the member variables with these two names
// so you can send them to your GraphPanel. Instantiate them
// here and fill the elements in this loop. The member
// variables remain null and choke up GraphPanel.
double interestPaid = 0; //Interest paid on the loan
double monthlyPrincipal = 0; //Principal in each monthly payment
//running total of principal after payment
double principalBalance = principal;
//String for output
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
//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
//formatting for output
displayArea.setCaretPosition(0);
displayArea.append((counter +1) + ")\t" +
df.format(monthlyPrincipal)+"\t\t" +
df.format(interestPaid)+"\t\t" +
df.format(principalBalance)+"\n");
}
}
if (command == graphButton) { //Function for Graph button
JDialog d = new JDialog(this, false);
d.getContentPane().add(new GraphPanel(monthlyPrincipal, interestPaid));
d.setSize(800,600);
d.setLocation(200,100);
d.setVisible(true);
/*
mFrame = new JFrame("Mortgage Payment Graph");
mFrame.getContentPane().add(new GraphPanel(monthlyPrincipal, interestPaid));
mFrame.setSize(800,600);
mFrame.setLocation(200,100);
*/
}
}
//reading from sequential file
private void load() {
Reader fis;
try {
fis = new InputStreamReader(getClass().getResourceAsStream("data.txt"));
BufferedReader br = new BufferedReader( fis );
termArray = new int[4];
rateArray = new double[4];
String line;
int i = 0;
while((line = br.readLine()) != null) {
String[] s = line.split(",");
termArray[ i ] = Integer.parseInt(s[0].trim());
rateArray[ i ] = Double.parseDouble(s[1].trim());
i++;
}
br.close();
} catch ( Exception e1 ) {
e1.printStackTrace( );
}
}
public static void main(String[] args) {
MC smc = new MC();
}
}
class GraphPanel extends JPanel {
final int
HPAD = 60,
VPAD = 40;
int[] data;
float[] principalData;
float[] interestData;
Font font;
public GraphPanel(float[] p, float[] i) {
principalData = p;
interestData = i;
font = new Font("lucida sans regular", Font.PLAIN, 16);
setBackground(Color.white);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
FontRenderContext frc = g2.getFontRenderContext();
int w = getWidth();
int h = getHeight();
// scales
float xInc = (w - HPAD - VPAD) / (interestData.length - 1);
float yInc = (h - 2*VPAD) / 10f;
int[] dataVals = getDataVals(); //min and max values for y-axis
float yScale = dataVals[2] / 10f;
// ordinate (y - axis)
g2.draw(new Line2D.Double(HPAD, VPAD, HPAD, h - VPAD));
// plot tic marks
float x1 = HPAD, y1 = VPAD, x2 = HPAD - 3, y2;
for(int j = 0; j < 10; j++) {
g2.draw(new Line2D.Double(x1, y1, x2, y1));
y1 += yInc;
}
// labels
String text; LineMetrics lm;
float xs, ys, textWidth, height;
for(int j = 0; j <= 10; j++) {
text = String.valueOf(dataVals[1] - (int)(j * yScale));
textWidth = (float)font.getStringBounds(text, frc).getWidth();
lm = font.getLineMetrics(text, frc);
height = lm.getAscent();
xs = HPAD - textWidth - 7;
ys = VPAD + (j * yInc) + height/2;
g2.drawString(text, xs, ys);
if(j == 0) g2.drawString("Principal", xs, ys - 15);
}
// abcissa (x - axis)
g2.draw(new Line2D.Double(HPAD, h - VPAD, w - VPAD, h - VPAD));
// tic marks
x1 = HPAD; y1 = h - VPAD; y2 = y1 + 3;
for(int j = 0; j < interestData.length; j++) {
g2.draw(new Line2D.Double(x1, y1, x1, y2));
x1 += xInc;
}
// labels
ys = h - VPAD;
for(int j = 0; j < interestData.length; j++) {
text = String.valueOf(j + 1);
textWidth = (float)font.getStringBounds(text, frc).getWidth();
lm = font.getLineMetrics(text, frc);
height = lm.getHeight();
xs = HPAD + j * xInc - textWidth/2;
g2.drawString(text, xs, ys + height);
if( j == (interestData.length - 1))
g2.drawString("Year", (int)w /2 , ys + height + 15);
}
// plot data
float yy2 = 0, yy1 = 0, xx2 = 0, xx1;
x1 = HPAD;
xx1 = HPAD;
yScale = (float)(h - 2*VPAD) / dataVals[2];
for(int j = 0; j < interestData.length; j++) {
g.setColor(Color.blue);
y1 = VPAD + (h - 2*VPAD) - (principalData[j] - dataVals[0]) * yScale;
g2.fillOval((int)x1, (int)y1 - 2, 5, 5);
if(j > 0)
g2.draw(new Line2D.Double(x1, y1, x2, y2));
x2 = x1;
y2 = y1;
x1 += xInc;
g.setColor(Color.red);
yy1 = VPAD + (h - 2*VPAD) - (interestData[j] - dataVals[0]) * yScale;
g2.fillOval((int)xx1, (int)yy1 - 1, 5, 5);
if(j > 0)
g2.draw(new Line2D.Double(xx1, yy1, xx2, yy2));
xx2 = xx1;
yy2 = yy1;
xx1 += xInc;
}
}
private int[] getDataVals() {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int j = interestData.length -1;
max = (int)principalData[j];
min = (int)interestData[j];
int span = max - min;
return new int[] { min, max, span };
}
}
|
|

07-30-2007, 05:12 AM
|
|
Member
|
|
Join Date: Jul 2007
Posts: 11
|
|
Wow.. you're good.  I can't thank you enough for just taking the time to look over it. Most people led me to believe it was hopeless. I'm still getting these two errors that I don't understand:
Line 185: ' ( ' expected else
^
Line 193: Illegal start of expression } (the last ' } ' in the code you see)
^
I understand the actual errors, but not sure what I can change in these two areas. Do you have any ideas? It's at the end of the exceptions:
try {
//Get input from Term text box, checked first before combo box
term = Integer.parseInt(termTxt.getText());
rate = Double.parseDouble(rateTxt.getText()); //Input from Rate text box
} catch(NumberFormatException e)
{
if
else
{
//If no option is selected and combo box null,
// this is an actual error.
JOptionPane.showMessageDialog(null, "Invaild Entry! " +
"Please Try Again",
"ERROR", JOptionPane.ERROR_MESSAGE);
}
}
The parts where you said "//Left this out" did you mean to say I should leave it out? Or was that something I left out that I should include? I was a little confused because like one area was the textbox where the result of the calculation is displayed...although I guess that's not terribly important in this program. Maybe that's what you were saying 
|
|

07-30-2007, 08:27 AM
|
|
Senior Member
|
|
Join Date: Jul 2007
Posts: 1,222
|
|
This area was commented out because it is unfinished/corrupted
if
else {
//If no option is selected and combo box null,
// this is an actual error.
JOptionPane.showMessageDialog(null, "Invaild Entry! " +
"Please Try Again",
"ERROR", JOptionPane.ERROR_MESSAGE);
}
Maybe it's a copy/paste glitch. You can eliminate the two lines at the top and the bottom line, leaving this:
//If no option is selected and combo box null,
// this is an actual error.
JOptionPane.showMessageDialog(null, "Invaild Entry! " +
"Please Try Again",
"ERROR", JOptionPane.ERROR_MESSAGE);
The parts where you said "//Left this out" did you mean to say I should leave it out? Or was that something I left out that I should include?
The second one. I added the line after each of the comments. The two statements were missing.
|
|

07-30-2007, 09:33 AM
|
|
Member
|
|
Join Date: Jul 2007
Posts: 11
|
|
|
There's some problems in my amortize function...doesn't want to allow subtract (-) or multiplication (*) with double/float.
Also it wants me to declare mFrame? (cannot find symbol... variable mFrame)I'm not sure how to do this other than what I have.
|
|

07-30-2007, 02:33 PM
|
|
Senior Member
|
|
Join Date: Jul 2007
Posts: 1,222
|
|
There's some problems in my amortize function...doesn't want to allow subtract (-) or multiplication (*) with double/float.
The member variables are float[] which are sent to the GraphPanel. The calculations in the amortizeButton ActionListener block are done in double precision. The member variables arrays can be (cast to float and) loaded in the amorization for loop.
Also it wants me to declare mFrame? (cannot find symbol... variable mFrame)I'm not sure how to do this other than what I have.
You had a member variable declaration which I removed. It was used in the graphButton AcitionListener block. I put in a JDialog instead and declared it as a local variable. You can put it back if you like.
Also, unrelated, the non–editable monthlyPayment textField looks a little dim. You could set it nonFocusable instead. Or use a JLabel.
Moved the DecimalFormats up to member variable scope.
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.io.*;
import java.text.*;
import javax.swing.*;
import javax.swing.border.*;
public class MC extends JFrame implements ActionListener {
JTextField principalTxt, termTxt, rateTxt, monthlyPaymentTxt;
JTextArea displayArea;
JButton calculateButton, graphButton, amortizeButton, clearButton, exitButton;
JComboBox options;
//formatting variables
DecimalFormat df = new DecimalFormat("\u00A4#,##0.00"); //currency
DecimalFormat pf = new DecimalFormat("#,##0.00%"); //percentages
DecimalFormat mi = new DecimalFormat("#,##0.000%"); //percentages
// Can these 6 be removed and declared as local variables?
int term = 0;
double principal = 0;
double rate = 0;
double monthlyPayment = 0;
double interest = 0;
int notePeriod = 0;
int[] termArray;
double[] rateArray;
private float[] principalAmts;
private float[] interestAmts;
public MC() {
super ("Mortgage Payment Calculator by S Kemen");
load();
// Initialize components.
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);
principalTxt = new JTextField(10);
JPanel row3 = new JPanel(new GridLayout(1, 2));
JLabel termLabel = new JLabel("Mortgage Term (Yrs)",JLabel.LEFT);
termTxt = new JTextField(10);
JPanel row4 = new JPanel(new GridLayout(1, 2));
JLabel rateLabel = new JLabel("Interest Rate (%)", JLabel.LEFT);
rateTxt = new JTextField(10);
JPanel row5 = new JPanel(new GridLayout(1, 2));
JLabel presetLabel = new JLabel("Preset Term and Interest Rate:", JLabel.LEFT);
options = new JComboBox();
MessageFormat mf = new MessageFormat("{0} years at {1,number,#.##}%");
JLabel choiceLabel = new JLabel(" (choose rate)");
for (int i = 0; i < termArray.length; i++) {
options.addItem(mf.format(new Object[] { new Integer(termArray [i]),
new Double(rateArray[i])}));
}
JPanel row6 = new JPanel(new GridLayout(1, 2));
JLabel monthlyPaymentLabel = new JLabel("Monthly Payment $", JLabel.LEFT);
monthlyPaymentTxt = new JTextField(10);
//create buttons
JPanel button = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
graphButton = new JButton("Display Graph");
amortizeButton = new JButton("Amortize Payments");
clearButton = new JButton("Clear");
exitButton = new JButton("Exit");
calculateButton = new JButton("Calculate");
//create textarea to display Amortize output
displayArea = new JTextArea(10, 45);
JScrollPane scroll = new JScrollPane(displayArea);
Container pane = getContentPane();
// Set layout before adding components.
pane.setLayout(new BoxLayout( pane, BoxLayout.Y_AXIS));
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);
pane.add(row5);
row5.add(presetLabel);
row5.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().height));
row5.setBorder( rowborder);
pane.add(row6);
row6.add(choiceLabel);
row6.setMaximumSize( new Dimension( 10000, row4.getMinimumSize().height));
row6.setBorder( rowborder);
JPanel radioPanel = new JPanel();
radioPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 4, 4 ));
radioPanel.add(options);
pane.add(radioPanel);
radioPanel.setMaximumSize( new Dimension( 10000,
radioPanel.getMinimumSize().height));
radioPanel.setBorder( rowborder);
JPanel row7 = new JPanel();
pane.add(row7);
row7.add(monthlyPaymentLabel);
row7.add(monthlyPaymentTxt);
// monthlyPaymentTxt.setEnabled(false); //set payment amount uneditable
monthlyPaymentTxt.setFocusable(false);
row7.setMaximumSize( new Dimension( 10000, row5.getMinimumSize().height));
row7.setBorder( rowborder);
//Add buttons
button.add(calculateButton);
button.add(clearButton);
button.add(exitButton);
button.add(amortizeButton);
button.add(graphButton);
pane.add(button);
button.setMaximumSize( new Dimension( 10000, button.getMinimumSize().height));
//scroll text pane for Amortize output
scroll.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
pane.add(scroll);
setContentPane(pane);
//add listeners for buttons and combo box
options.addActionListener(this);
clearButton.addActionListener(this);
exitButton.addActionListener(this);
calculateButton.addActionListener(this);
amortizeButton.addActionListener(this);
graphButton.addActionListener(this);
// Keep JFrame method together.
setSize(550, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent event) {
Object command = event.getSource();
if(command == calculateButton) { //function for Calculate button
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 {
//Get input from Term text box, checked first before combo box
term = Integer.parseInt(termTxt.getText());
rate = Double.parseDouble(rateTxt.getText()); //Input from Rate text box
} catch(NumberFormatException e) {
//If Term and Rate are null, buttons are checked for input values
//Set rate and term based on which item in the combobox is selected
//Still have to fill in this area for the combo box arrays
//If no option is selected and combo box null,
// this is an actual error.
JOptionPane.showMessageDialog(null, "Invaild Entry! " +
"Please Try Again",
"ERROR", JOptionPane.ERROR_MESSAGE);
}
interest = rate / 100 / 12; //Monthly interst rate
notePeriod = term * 12; //Number of months over which loan is amortized
//calculation formula
monthlyPayment = (principal * interest) /
(1 - Math.pow(1 + interest, -notePeriod));
monthlyPaymentTxt.setText("" + df.format(monthlyPayment));
}
if(command == clearButton) { //Function for Clear button
principalTxt.setText("");
monthlyPaymentTxt.setText("");
rateTxt.setText("");
termTxt.setText("");
displayArea.setText("");
}
if(command == exitButton) { //Function for Exit button
System.exit(0);
}
if (command == amortizeButton) { //Function for Amortize button
//Amoritization variables
double loanBalance = notePeriod * monthlyPayment;
// You need to use the member variables with these two names
// so you can send them to your GraphPanel. Instantiate them
// here and fill the elements in this loop. The member
// variables remain null and choke up GraphPanel.
double interestPaid = 0; //Interest paid on the loan
double monthlyPrincipal = 0; //Principal in each monthly payment
//running total of principal after payment
double principalBalance = principal;
//String for output
String titles = "Month\t Principal\t\tInterest\t\tBalance\n";
displayArea.setText(titles);
displayArea.append(""); //Inserts a blank line
interestAmts = new float[term*12];
principalAmts = new float[term*12];
//This loop is used to calculate and display the payment schedule information
for(int counter = 0; counter < term * 12 - 0; counter++) { //start outer loop
//start inner loop
interestPaid = principalBalance * interest;
interestAmts[counter] = (float)interestPaid;
monthlyPrincipal = monthlyPayment - interestPaid;
principalAmts[counter] = (float)monthlyPrincipal;
loanBalance = loanBalance - monthlyPayment;
principalBalance = principalBalance - monthlyPrincipal;
//formatting for output
displayArea.setCaretPosition(0);
displayArea.append((counter +1) + ")\t" +
df.format(monthlyPrincipal)+"\t\t" +
df.format(interestPaid)+"\t\t" +
df.format(principalBalance)+"\n");
}
}
if (command == graphButton) { //Function for Graph button
JDialog d = new JDialog(this, false);
d.getContentPane().add(new GraphPanel(principalAmts, interestAmts));
d.setSize(800,600);
d.setLocation(200,100);
d.setVisible(true);
}
}
//reading from sequential file
private void load() {
Reader fis;
try {
fis = new InputStreamReader(getClass().getResourceAsStream("data.txt"));
BufferedReader br = new BufferedReader( fis );
termArray = new int[4];
rateArray = new double[4];
String line;
int i = 0;
while((line = br.readLine()) != null) {
String[] s = line.split(",");
termArray[ i ] = Integer.parseInt(s[0].trim());
rateArray[ i ] = Double.parseDouble(s[1].trim());
i++;
}
br.close();
} catch ( Exception e1 ) {
e1.printStackTrace( );
}
}
public static void main(String[] args) {
MC smc = new MC();
}
}
|
|

07-30-2007, 07:51 PM
|
|
Member
|
|
Join Date: Jul 2007
Posts: 11
|
|
Good morning! (well it's still morning here  )
<<<<Nvm, this was an obvious. Sorry I had just woke up>>>
Last edited by rhivka : 07-30-2007 at 10:46 PM.
|
|

07-30-2007, 10:57 PM
|
|
Member
|
|
Join Date: Jul 2007
Posts: 11
|
|
Ok, I inserted the GraphPanel class and I managed to compile with no errors...yay!!  But... the UI is blank when the program starts up.  Is this something I did while inserting the GraphPanel? Here is what the program looks like from the "read from sequential file" section down. Could you take a look and see if I'm missing something? Or do you maybe know why it is blank already from the previous code? Thanks for your time.
//reading from sequential file
private void load() {
Reader fis;
try {
fis = new InputStreamReader(getClass().getResourceAsStream("data.txt"));
BufferedReader br = new BufferedReader( fis );
termArray = new int[4];
rateArray = new double[4];
String line;
int i = 0;
while((line = br.readLine()) != null) {
String[] s = line.split(",");
termArray[ i ] = Integer.parseInt(s[0].trim());
rateArray[ i ] = Double.parseDouble(s[1].trim());
i++;
}
br.close();
} catch ( Exception e1 ) {
e1.printStackTrace( );
}
}
class GraphPanel extends JPanel
{
final int
HPAD = 60,
VPAD = 40;
int[] data;
Font font;
float[] principalAmts;
float[] interestAmts;
public GraphPanel(float[] principalAmts, float[] interestAmts)
{
font = new Font("lucida sans regular", Font.PLAIN, 16);
setBackground(Color.white);
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
FontRenderContext frc = g2.getFontRenderContext();
int w = getWidth();
int h = getHeight();
// scales
float xInc = (w - HPAD - VPAD) / (interestAmts.length - 1);//11f; //distance between each point
float yInc = (h - 2*VPAD) / 10f;
int[] dataVals = getDataVals(); //min and max values for y-axis
float yScale = dataVals[2] / 10f;
// ordinate (y - axis)
g2.draw(new Line2D.Double(HPAD, VPAD, HPAD, h - VPAD));
// plot tic marks
float x1 = HPAD, y1 = VPAD, x2 = HPAD - 3, y2;
for(int j = 0; j < 10; j++)
{
g2.draw(new Line2D.Double(x1, y1, x2, y1));
y1 += yInc;
}
// labels
String text; LineMetrics lm;
float xs, ys, textWidth, height;
for(int j = 0; j <= 10; j++)
{
text = String.valueOf(dataVals[1] - (int)(j * yScale));
textWidth = (float)font.getStringBounds(text, frc).getWidth();
lm = font.getLineMetrics(text, frc);
height = lm.getAscent();
xs = HPAD - textWidth - 7;
ys = VPAD + (j * yInc) + height/2;
g2.drawString(text, xs, ys);
if(j == 0) g2.drawString("Principal", xs, ys - 15);
}
// abcissa (x - axis)
g2.draw(new Line2D.Double(HPAD, h - VPAD, w - VPAD, h - VPAD));
// tic marks
x1 = HPAD; y1 = h - VPAD; y2 = y1 + 3;
for(int j = 0; j < interestAmts.length; j++)
{
g2.draw(new Line2D.Double(x1, y1, x1, y2));
x1 += xInc;
}
// labels
ys = h - VPAD;
for(int j = 0; j < interestAmts.length; j++)
{
text = String.valueOf(j + 1);
textWidth = (float)font.getStringBounds(text, frc).getWidth();
lm = font.getLineMetrics(text, frc);
height = lm.getHeight();
xs = HPAD + j * xInc - textWidth/2;
g2.drawString(text, xs, ys + height);
if( j == (interestAmts.length - 1)) g2.drawString("Year", (int)w /2 , ys + height + 15);
}
// plot data
float yy2 = 0, yy1 = 0, xx2 = 0, xx1;
x1 = HPAD;
xx1 = HPAD;
yScale = (float)(h - 2*VPAD) / dataVals[2];
for(int j = 0; j < interestAmts.length; j++)
{
g.setColor(Color.blue);
y1 = VPAD + (h - 2*VPAD) - (principalAmts[j] - dataVals[0]) * yScale;
g2.fillOval((int)x1, (int)y1 - 2, 5, 5);
if(j > 0)
g2.draw(new Line2D.Double(x1, y1, x2, y2));
x2 = x1;
y2 = y1;
x1 += xInc;
g.setColor(Color.red);
yy1 = VPAD + (h - 2*VPAD) - (interestAmts[j] - dataVals[0]) * yScale;
g2.fillOval((int)xx1, (int)yy1 - 1, 5, 5);
if(j > 0)
g2.draw(new Line2D.Double(xx1, yy1, xx2, yy2));
xx2 = xx1;
yy2 = yy1;
xx1 += xInc;
}
}
private int[] getDataVals()
{
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int j = interestAmts.length -1;
max = (int)principalAmts[j];
min = (int)interestAmts[j];
int span = max - min;
return new int[] { min, max, span };
}
}
public static void main(String[] args) {
MC smc = new MC();
}
}
|
|

07-30-2007, 11:03 PM
|
|
Member
|
|
Join Date: Jul 2007
Posts: 11
|
|
|
Thank you!
Umm.. figured that out too.  Hardwired...thank you SO MUCH for your help. You made my night.. and next day. I don't know what I would have done without your input and if I could give you some kind of points... or a hug.. I would 
Last edited by rhivka : 07-31-2007 at 12:52 AM.
Reason: fixed program errors, no need for question I had posted
|
|
| Thread Tools |
|
|
| Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
| |