import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class CubicGraph extends JPanel  {
    public void paintComponent(Graphics gfx) {
        super.paintComponent(gfx);
        setBackground(Color.white);
        Graphics2D g = (Graphics2D) gfx;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                           RenderingHints.VALUE_ANTIALIAS_ON);
        AffineTransform transform = new AffineTransform();
        transform.translate(150, 150);
        transform.scale(1, -1);
        transform.scale(75, 50);

        g.setPaint(Color.lightGray);
        GeneralPath path = new GeneralPath();
        for (int i = -2; i <= 2; i++) {
            path.moveTo(i, -3);
            path.lineTo(i, 3);
        }
        for (int i = -3; i <= 3; i++) {
            path.moveTo(-2, i);
            path.lineTo(2, i);
        }

        g.draw(transform.createTransformedShape(path));
        int steps = 100;
        float dx = 4.0f/steps;
        g.setPaint(Color.black);
        path = new GeneralPath();
        path.moveTo(-2, valueAt(-2));
        for (float x = -2+dx;  x <= 2; x += dx)
            path.lineTo(x, valueAt(x));
        g.draw(transform.createTransformedShape(path));
    }

    public float valueAt(float x) {
        return x*x*x-x;
    }
    
    public static void main(String[] args) {
        JPEGDrawFrame frame = new JPEGDrawFrame("CubicGraph");
        CubicGraph quad = new CubicGraph();
        frame.getContentPane().add(quad, BorderLayout.CENTER);
        quad.setPreferredSize(new Dimension(301, 301));
        frame.pack();
        frame.show();
    }
}
