# Java: Summary: Graphics Usage

Subclass JPanel or JComponent to make a "canvas" to draw on.

## Call these methods in JComponent or JPanel subclass constructor

Use these calls in the constructor to set the initial values.

    setPreferredSize(new Dimension(width, height)); // Set size in pixels.
    setBackground(Color c);  // Set background color.   See JComponent vs JPanel.
    setForeground(Color c);  // Set the initial pen color. Defaults to black.

## Call these methods in `paintComponent()` to get current size

    int w = getWidth();       // Get width of the drawing area
    int h = getHeight();      // Get height ...

## Extend JComponent or JPanel for drawing

Graphics are usually drawn on a subclass of JComponent or JPanel by overriding the `paintComponent` method. This class may be defined as an inner class of a JFrame so that it can access the outer class's fields. The constructor should set the size.

    class MyDrawing extends JComponent {
        //======================================================= constructor
       public MyDrawing() {
           setPreferredSize(new Dimension(200, 100));
       }

       //============================================ override paintComponent
       @Override public void paintComponent(Graphics g) {
           g.setColor(Color.WHITE);           // Set background color
           g.fillRect(0, 0, getWidth(), getHeight());  // Fill area with background.
           setColor(Color.BLACK);             // Restore color for drawing.

           g.drawOval(0,0, 100, 100);         // Do your drawing here.
       }
    }

Background painting is main difference. The JComponent class doesn't paint its background, so you have to paint the background in the overridden `paintComponent` method. In contrast, JPanel has an opaque background which can be painted by calling its `paintComponennt` method as below. You can set the background color of a JComponent, but the JComponent class never uses it.

    class MyDrawing extends JPanel {
        //======================================================= constructor
       public MyDrawing() {
           setBackground(Color.WHITE);
           setPreferredSize(new Dimension(200, 100));
       }

       //============================================ override paintComponent
       @Override public void paintComponent(Graphics g) {
           super.paintComponent(g);      // Call parent JPanel paintComponent

           g.drawOval(0,0, 100, 100);    // Do your drawing here.
       }
    }