问题
I'm trying to understand when to use revalidate/repaint/pack.
Surprisingly I haven't found much detailed under-the-hood documentation (feel free to link).
So far I have understood that this is all the responsibility of the RepaintManager.
- paint/repaint refer to what sees as dirty/clean
- pack/validate/revalidate refer to what is valid
This article on Oracle explains that calling a repaint enqueues a job on the Event Dispatcher Thread that will in turn call paintImmediately() on the component (this redraws the component).
This trail indicates that to be or not to be valid is associated with the LayoutManager. And that this is all about the size of the component rather than the content.
- Is it true that you should call revalidate when you move/resize your component and repaint when you change it's contents?
- Is the pack() method really a deprecated thing that you should never call?
- Are any of the above claims wrong?
回答1:
Here are a few basic cases where you need to invoke those methods (I cover the basics but I may have missed a few other cases where calling those methods would be required).
- You should call
revalidate()
on a container when you have either: added one or more component, removed one or more components, changed the constraints of one or more contained components (constraints or XXXSize(), although the latter is not recommended), changed theLayoutManager
of the container. - You should call
repaint()
whenever you want that component (and its descendants) to be repainted. Eventually, this will callpaintComponent()
(for basic widgets this will delegate to XXXUI.paint()),paintBorder()
andpaintChildren()
(at least in Swing) pack()
actually sets the size of a window to its preferred size. You should usually call this right before making the window visible. You may call it later on but this will give a weird user experience (I don't know many applications that resize their windows once displayed)
The main advantage of using revalidate()
and repaint()
is that they can coalesce themselves. This means that if you call several times repaint()
, the painting will only be performed once.
来源:https://stackoverflow.com/questions/14341618/swing-refresh-cycle