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

令人惊讶的是,我还没有找到很多详细的后台文件(可以随意链接)。

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

  • 油漆/重绘(repaint)指的是肮脏/干净的
  • pack/validate/revalidate是指有效的

  • This article on Oracle解释说,调用重新绘制使事件分派(dispatch)器线程上的作业入队,该任务随后将在组件上调用paintImmediately()(这将重新绘制组件)。

    This trail表示有效或无效与LayoutManager相关联。而且这全都与组件的大小有关,而不是内容。
  • 是真的吗?在移动/调整组件大小时应调用revalidate,在更改其内容时应重新绘制?
  • pack()方法真的是一种不赞成使用的东西,您永远不要调用它吗?
  • 以上任何说法有误吗?
  • 最佳答案

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

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

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

    关于java - 摆动刷新周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14341618/

    10-12 00:29