我正在尝试了解何时使用revalidate / repaint / pack。
令人惊讶的是,我没有找到更详细的引擎盖文档(随意链接)。
到目前为止,我已经明白这是RepaintManager的全部责任。
This article on Oracle解释说,调用重绘会在Event Dispatcher Thread上排队一个作业,该作业将在组件上调用paintImmediately()(这会重绘组件)。
This trail表示要生效或不生效与LayoutManager相关联。而这完全取决于组件的大小而不是内容。
答案 0 :(得分:6)
以下是一些需要调用这些方法的基本情况(我介绍了基础知识,但我可能已经错过了其他一些需要调用这些方法的情况)。
revalidate()
:添加一个或多个组件,删除一个或多个组件,更改一个或多个包含组件的约束(约束或XXXSize(),尽管后者不推荐),更改了容器的LayoutManager
。repaint()
。最终,这将调用paintComponent()
(对于将委托给XXXUI.paint()的基本小部件),paintBorder()
和paintChildren()
(至少在Swing中)pack()
实际上将窗口大小设置为其首选大小。在使窗口可见之前,通常应该调用此方法。您可以稍后调用它,但这会给用户带来奇怪的体验(我不知道很多应用程序会在显示后调整窗口大小)使用revalidate()
和repaint()
的主要优点是它们可以合并自己。这意味着如果您多次调用repaint()
,则只会执行一次绘画。