# Java: JPanel - Drawing Area

## To use a JPanel for graphics

1. Define a new class that extends JPanel and define a `paintComponent` method in it.
2. Create an instance of the class and add it to a panel.

## Define a subclass of JPanel and override `paintComponent()`

Create a subclass of JPanel to override its `paintComponent()` method. It may be more convenient to define this class inside of your outer class so that it can access instance variables (fields) in the outer class. For example,

    . . .
    class MyDrawing extends JPanel {
        . . .  // Methods, constructors, fields.
        @Override public void paintComponent(Graphics g) {
             super.paintComponent(g);    // paints background
             . . .  // do your drawing here
        }
    }

### `super.paintComponent()`

The first line in `paintComponent()` is usually a call to the parent class's `paintComponent()` method (`super` refers to the parent class). The call to the parent's method may be omitted if the entire background is drawn by your version of `paintComponent()` so that it appears opaque, but it's probably best to make the call to avoid what Sun calls "visual artifacts".

## Override `paintComponent()` rather than `paint()`

You sometimes see code that overrides `paint()` instead of `paintComponent()`. This was necessary in the older AWT, however in Swing `paint()` calls three methods: `paintComponent()`, `paintBorder()`, and `paintChildren`. The general rule is to override `paintComponent()` if you're using Swing (JComponent, JPanel, JApplet) and `paint()` if you're using one of the AWT classes (Applet, Canvas).

## Using the new class on a layout

When you create your GUI (usually in a constructor) create a new drawing panel object and add it to a container (the content pane or another panel). For example (assuming `content` is a content pane or a panel).

        . . .
    MyDrawing drawing = new MyDrawing();
    content.add(drawing);

## Repaint the panel after changes

Whenever the drawing needs to be changed because a value in the program has changed, call the panel's `repaint()` method. Often a listener (for a button, menu item, timer, ...) changes a value, then calls `repaint()`, which (eventually) calls your `paintComponent()` method. For example,

    . . . // After anything changes that should appear in graphics
    drawing.repaint();