Java Swing revalidate() vs repaint()
Asked Answered
S

5

231

I'm putting together a Swing application where I often want to replace the contents of a JPanel. To do this, I'm calling removeAll(), then adding my new content, then calling revalidate().

However I'm finding that the old content is still actually visible (though obscured by the the new content). If I add a call to repaint() in addition to revalidate(), it works as expected.

I'm sure on other occasions I've experienced that just calling revalidate() is enough.

So basically my question is - should I need to call both functions and if not, when should I call each of them?

Septuagint answered 8/7, 2009 at 10:58 Comment(1)
This tutorial from Oracle states: "Always invoke repaint after revalidate". No explanation is provided though.Professional
P
176

You need to call repaint() and revalidate(). The first one tells Swing that an area of the window is dirty (which is necessary to erase the image of the old children removed by removeAll()); the second one tells the layout manager to recalculate the layout (which is necessary when adding components). This should cause children of the panel to repaint, but may not cause the panel itself to do so (see this for the list of repaint triggers).

On a more general note: rather than reusing the original panel, I'd recommend building a new panel and swapping them at the parent.

Pinochle answered 8/7, 2009 at 10:58 Comment(2)
Could you rationalize why building a new panel is a better solution than using the old one? :)Monagan
@Monagan - it's less work, and therefore less prone to errors.Pinochle
T
91

Any time you do a remove() or a removeAll(), you should call

  validate();
  repaint();

after you have completed add()'ing the new components.

Calling validate() or revalidate() is mandatory when you do a remove() - see the relevant javadocs.

My own testing indicates that repaint() is also necessary. I'm not sure exactly why.

Tanner answered 10/2, 2010 at 12:46 Comment(0)
B
63

revalidate is called on a container once new components are added or old ones removed. this call is an instruction to tell the layout manager to reset based on the new component list. revalidate will trigger a call to repaint what the component thinks are 'dirty regions.' Obviously not all of the regions on your JPanel are considered dirty by the RepaintManager.

repaint is used to tell a component to repaint itself. It is often the case that you need to call this in order to cleanup conditions such as yours.

Beta answered 8/7, 2009 at 11:44 Comment(0)
G
7

revalidate() just request to layout the container, when you experienced simply call revalidate() works, it could be caused by the updating of child components bounds triggers the repaint() when their bounds are changed during the re-layout. In the case you mentioned, only component removed and no component bounds are changed, this case no repaint() is "accidentally" triggered.

Genetics answered 16/8, 2017 at 15:31 Comment(0)
C
-4

yes you need to call repaint(); revalidate(); when you call removeAll() then you have to call repaint() and revalidate()

Comma answered 5/7, 2016 at 10:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.