我试图了解何时使用revalidate/repaint/pack。
令人惊讶的是,我还没有找到很多详细的后台文件(可以随意链接)。
到目前为止,我已经了解到这是RepaintManager的全部责任。
This article on Oracle解释说,调用重新绘制使事件分派(dispatch)器线程上的作业入队,该任务随后将在组件上调用paintImmediately()(这将重新绘制组件)。
This trail表示有效或无效与LayoutManager相关联。而且这全都与组件的大小有关,而不是内容。
最佳答案
这里有一些需要调用这些方法的基本情况(我介绍了基础知识,但是我可能错过了一些需要调用这些方法的其他情况)。
revalidate()
:添加一个或多个组件,删除一个或多个组件,更改一个或多个包含的组件的约束(constraints或XXXSize(),尽管不建议使用后者),已更改容器的LayoutManager
。 repaint()
。最终,这将调用paintComponent()
(对于基本小部件,它将委托(delegate)给XXXUI.paint()),paintBorder()
和paintChildren()
(至少在Swing中)pack()
实际上将窗口的大小设置为其首选大小。通常,应该在使窗口可见之前立即调用此功能。您可以稍后再调用它,但这会给用户带来奇怪的体验(我不知道很多应用程序一旦显示就会调整窗口大小)使用
revalidate()
和repaint()
的主要优点是它们可以合并在一起。这意味着,如果您多次调用repaint()
,则绘画将仅执行一次。关于java - 摆动刷新周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14341618/