5

我试图了解何时使用 revalidate/repaint/pack。

令人惊讶的是,我没有找到非常详细的幕后文档(请随意链接)。

到目前为止,我已经明白这是 RepaintManager 的全部责任。

  • 油漆/重漆是指看起来很脏/干净的东西
  • pack/validate/revalidate 指的是什么是有效的

这篇关于 Oracle的文章解释说,调用重绘会在 Event Dispatcher 线程上将一个作业排入队列,该线程又会在组件上调用 paintImmediately()(这会重绘组件)。

该轨迹表明有效与否与 LayoutManager 相关联。这完全是关于组件的大小而不是内容。

  1. 当您移动/调整组件大小并在更改其内容时重新绘制时,您是否应该调用 revalidate?
  2. pack() 方法真的是你不应该调用的不推荐使用的东西吗?
  3. 上述任何主张有错吗?
4

1 回答 1

6

以下是您需要调用这些方法的一些基本情况(我介绍了基础知识,但我可能错过了一些需要调用这些方法的其他情况)。

  1. 您应该revalidate()在以下情况下调用容器:添加一个或多个组件,删除一个或多个组件,更改一个或多个包含组件的约束(约束或 XXXSize(),尽管不建议使用后者),LayoutManager更改容器。
  2. 您应该repaint()在想要重新绘制该组件(及其后代)时调用。最终,这将调用paintComponent()(对于基本小部件,这将委托给 XXXUI.paint()),paintBorder()并且paintChildren()(至少在 Swing 中)
  3. pack()实际上将窗口的大小设置为其首选大小。您通常应该在使窗口可见之前调用它。您可以稍后调用它,但这会给用户带来奇怪的体验(我不知道有多少应用程序会在显示后调整其窗口大小)

使用revalidate()and的主要优点repaint()是它们可以自行合并。这意味着如果您多次调用repaint(),绘画将只执行一次。

于 2013-01-15T16:05:32.700 回答