Results 1 to 9 of 9
- 07-29-2007, 10:48 PM #1
Member
- Join Date
- Jul 2007
- Posts
- 11
- Rep Power
- 0
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!
The external file (data.txt) contains the following:Java Code: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
7,5.35
15,5.5
20,5.65
30,5.75
Feel free to criticize or offer advice :o Thank you!
- 07-30-2007, 01:51 AM #2
Java Code: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, 03:12 AM #3
Member
- Join Date
- Jul 2007
- Posts
- 11
- Rep Power
- 0
Wow.. you're good. :D 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:
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 ;)Java Code: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); } }
- 07-30-2007, 06:27 AM #4
This area was commented out because it is unfinished/corrupted
Maybe it's a copy/paste glitch. You can eliminate the two lines at the top and the bottom line, leaving this:Java Code: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?Java Code://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 second one. I added the line after each of the comments. The two statements were missing.
- 07-30-2007, 07:33 AM #5
Member
- Join Date
- Jul 2007
- Posts
- 11
- Rep Power
- 0
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, 12:33 PM #6
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.
Java Code: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, 05:51 PM #7
Member
- Join Date
- Jul 2007
- Posts
- 11
- Rep Power
- 0
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 08:46 PM.
- 07-30-2007, 08:57 PM #8
Member
- Join Date
- Jul 2007
- Posts
- 11
- Rep Power
- 0
Ok, I inserted the GraphPanel class and I managed to compile with no errors...yay!! :D But... the UI is blank when the program starts up. :eek: 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.
Java Code://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, 09:03 PM #9
Member
- Join Date
- Jul 2007
- Posts
- 11
- Rep Power
- 0
Thank you!
Umm.. figured that out too. :p 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-30-2007 at 10:52 PM. Reason: fixed program errors, no need for question I had posted
Similar Threads
-
[SOLVED] file i/o problem
By aytidaalkuhs in forum New To JavaReplies: 3Last Post: 04-06-2008, 06:42 PM -
problem with jar file pls help
By jinu5 in forum New To JavaReplies: 0Last Post: 08-15-2007, 10:41 PM -
Problem in batch file
By marwa in forum New To JavaReplies: 0Last Post: 08-14-2007, 10:24 AM -
Problem in opening a file
By Raghav kv in forum New To JavaReplies: 1Last Post: 08-11-2007, 01:55 PM -
problem when I try to delete a file
By tommy in forum Advanced JavaReplies: 2Last Post: 07-31-2007, 02:44 PM


LinkBack URL
About LinkBacks
Reply With Quote
Bookmarks