Solved

# Need help with paintComponent for a graph

Posted on 2006-11-26

I wrote a program that could take the values of a polynomial and calculate f(x). Im trying to get these values to graph,but when JFrame is called it just gives me a blank frame. How come none of my tick marks or my toString method isn't getting 'painted' onto the panel? I made a seperate class just like i was told to do on a previous question,but yet it just makes a blank panel. Any help would be greatly appreciated.

My code is as follows

MAIN

import java.util.Scanner;

import java.text.DecimalFormat;

import javax.swing.*;

import java.awt.*;

public class Poly

{

public static void main (String[] args)

{

//Sets up variables

double c4,c3,c2,c1,c0,x,interval,xvalue;

int ptnumber,counter;

String result;

//Sets up deciamal formatting so that only 3 significant digits are displayed

DecimalFormat fmt = new DecimalFormat ("0.##");

Scanner scan = new Scanner (System.in);

//Asks the user to input 4 coefficients,a constant,number of values to calculate,and the starting point of x

System.out.print ("Enter the coefficient of x^4(0.0 if none:");

c4 = scan.nextDouble();

System.out.print ("Enter the coefficient of x^3(0.0 if none:");

c3 = scan.nextDouble();

System.out.print ("Enter the coefficient of x^2(0.0 if none:");

c2 = scan.nextDouble();

System.out.print ("Enter the coefficient of x^1(0.0 if none:");

c1 = scan.nextDouble();

System.out.print ("Enter the constant:");

c0 = scan.nextDouble();

System.out.print ("Enter the starting value of x:");

x = scan.nextDouble();

System.out.print ("Enter the number of points to be graphed(Integer):");

ptnumber = scan.nextInt();

System.out.print ("Enter the interval between points:");

interval = scan.nextDouble();

//Sets up an polynomial object with data in it

Polynomial pn = new Polynomial(c4, c3, c2, c1, c0);

//Calls the toString method to print out the formula with proper formatting

System.out.println("f(x)="+pn);

//Prints the lables for the table

System.out.println("x | f(x)");

System.out.println("----------");

//Initiates Counter

counter = 0;

//Starts a while loop that loops according to how many values are to be printed

while (counter < ptnumber)

{

//Calls the evaluate method to calculate f(x) from x and then prints it so many times

System.out.println(fmt.format(x) +" | "+fmt.format(pn.evaluate(x)));

//Calculates the x intervals so that f(x) can be calculated appropriately

x = (x + interval);

//Adds one to variable counter for each loop

counter++;

}

JFrame frame = new JFrame("Polynomial");

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(new PolynomialPanel());

frame.pack();

frame.setVisible(true);

}

}

POLYNOMIALPANEL CLASS

import javax.swing.*;

import java.awt.*;

import java.text.DecimalFormat;

public class PolynomialPanel extends JPanel

{

public PolynomialPanel()

{

setPreferredSize (new Dimension(600,600));

}

public void paintComponent(Graphics page, int xPixels, int yPixels)

{

super.paintComponent (page);

final int NUM = 11;

final double INTERVAL = 0.5;

final double XSTART = 0.0;

final int XMARGIN = 70;

final int XUSABLEPIXELS = xPixels - 2*XMARGIN;

final int XINTERVALPIXELS = XUSABLEPIXELS/(NUM - 1);

final int YMARGIN =40;

final int YUSABLEPIXELS = yPixels - 2*YMARGIN;

// Label the graph

page.drawString("Graph of f(x) = " + toString(), XMARGIN + 20, YMARGIN);

// Draw the x axis and put in hash marks

page.drawLine(XMARGIN, yPixels - YMARGIN, xPixels - XMARGIN, yPixels - YMARGIN);

for ( int i = 0; i < NUM; i++ )

page.drawLine(XMARGIN + i * XINTERVALPIXELS, yPixels - YMARGIN, XMARGIN + i * XINTERVALPIXELS, yPixels - YMARGIN + 5);

DecimalFormat twoPlaces = new DecimalFormat("0.00");

// Label the x axis

for (int i = 0; i < NUM; i++)

{

page.drawString( twoPlaces.format(XSTART + i * INTERVAL), 3 * XMARGIN / 4 + i * XINTERVALPIXELS, yPixels - YMARGIN/2);

}

// Draw the y axis

page.drawLine(XMARGIN, YMARGIN, XMARGIN, yPixels - YMARGIN);

// Label the y axis and put in hash marks

final double YMIN = 0.0;

final double YINTERVAL = 100.0;

final int YINTERVALPIXELS = YUSABLEPIXELS / 10;

for (int i = 0; i < NUM; i++)

{

page.drawString(twoPlaces.format(YMIN + i * YINTERVAL), XMARGIN / 4, yPixels - i * YINTERVALPIXELS - YMARGIN);

page.drawLine(XMARGIN, yPixels - YMARGIN - i * YINTERVALPIXELS, XMARGIN - 5, yPixels - YMARGIN - i * YINTERVALPIXELS);

}

}

}