- What does it do?
It prints the component as if you hadn’t overridden the
paintComponent method. If you have a background color set for instance, this is typically painted by the class you’re extending.
- When do we need to use it?
You use it if you don’t paint on the entire component. The parts that you don’t paint will “shine through” which means that you should let the super class paint those parts. As with the example of the background color for instance: If you just paint a circle in the middle of the component,
super.paintComponent will make sure the background color is painted around the circle.
If you do paint the entire area of your component, then you will paint on top of whatever super.paintComponent paints and thus there’s no point in calling super.paintComponent.
- What advantage does it gives us by writing it in paintComponent()?
That’s the only logical place to put it.
paintComponent is called when the component should be painted, and, as mentioned above, if you don’t paint the entire component yourself, you need
super.paintComponent to paint on the parts that shine through.
The documentation of
paintComponent says it pretty well:
[…] if you do not invoker super’s implementation you must honor the opaque property, that is if this component is opaque, you must completely fill in the background in a non-opaque color. If you do not honor the opaque property you will likely see visual artifact