Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does super.paintComponent(g) do?

What does super.paintComponent(g) do (especially when we place it inside paintComponent() method)? I am surprised I don't see anyone asking this in SO before.

I dig out my school notes on Java Graphics, the only thing it mentioned on this line of code is "do not delete".

However I have been practicing and tying out on Java paintComponent() method these few weeks. So far I have not included that line into my codes, and everything seems to work well (so far). So..

Questions:

  1. What does it do?
  2. When do we need to use it?
  3. What advantage does it gives us by writing it in paintComponent()?
like image 325
user3437460 Avatar asked Feb 25 '15 16:02

user3437460


People also ask

What is paintComponent in Java?

By now you know that the paintComponent method is where all of your painting code should be placed. It is true that this method will be invoked when it is time to paint, but painting actually begins higher up the class hierarchy, with the paint method (defined by java. awt.

What is a paintComponent call?

The paintComponent is called "on-demand" i.e. when the system decides that the component needs to be redrawn. (Could for instance be when the component is resized, or when the window is restored from a minimized state.)

How do I call the paintComponent method?

The paintComponent() method can also be called explicitly by the repaint() method defined in Component class. The effect of calling repaint() is that Swing automatically clears the graphic on the panel and executes the paintComponent method to redraw the graphics on this panel.

Does JFrame have paintComponent?

JFrame is not a JComponent , it doesn't have a paintComponent method you can override. Instead you could extend a JPanel and add it to the frame.


2 Answers

From the Java Painting Tutorial:

Most of the standard Swing components have their look and feel implemented by separate "UI Delegate" objects. The invocation of super.paintComponent(g) passes the graphics context off to the component's UI delegate, which paints the panel's background. For a closer look at this process, see the section entitled "Painting and the UI Delegate" in the aforementioned SDN article.

like image 25
Kevin Workman Avatar answered Sep 20 '22 20:09

Kevin Workman


  1. 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.

  1. 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.

  1. 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 artifacts.

like image 175
aioobe Avatar answered Sep 18 '22 20:09

aioobe