Swing refresh cycle

一个人想着一个人 提交于 2021-02-07 07:45:17

问题


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.

  1. Is it true that you should call revalidate when you move/resize your component and repaint when you change it's contents?
  2. Is the pack() method really a deprecated thing that you should never call?
  3. 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).

  1. 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 the LayoutManager of the container.
  2. You should call repaint() whenever you want that component (and its descendants) to be repainted. Eventually, this will call paintComponent() (for basic widgets this will delegate to XXXUI.paint()), paintBorder() and paintChildren() (at least in Swing)
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!