Swing刷新周期

时间:2013-01-15 15:57:46

标签: java swing refresh repaint

我正在尝试了解何时使用revalidate / repaint / pack。

令人惊讶的是,我没有找到更详细的引擎盖文档(随意链接)。

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

  • paint / repaint是指看作脏/干净的东西
  • pack / validate / revalidate指的是什么是有效的

This article on Oracle解释说,调用重绘会在Event Dispatcher Thread上排队一个作业,该作业将在组件上调用paintImmediately()(这会重绘组件)。

This trail表示要生效或不生效与LayoutManager相关联。而这完全取决于组件的大小而不是内容。

  1. 在移动/调整组件大小时是否应该调用revalidate,并在更改组件时重新绘制内容?
  2. pack()方法真的是一个你不应该打电话的弃用的东西吗?
  3. 以上任何一项说法都错了吗?

1 个答案:

答案 0 :(得分:6)

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

  1. 当你有一个容器时,你应该在容器上调用revalidate():添加一个或多个组件,删除一个或多个组件,更改一个或多个包含组件的约束(约束或XXXSize(),尽管后者不推荐),更改了容器的LayoutManager
  2. 只要您想要重新绘制该组件(及其后代),就应该调用repaint()。最终,这将调用paintComponent()(对于将委托给XXXUI.paint()的基本小部件),paintBorder()paintChildren()(至少在Swing中)
  3. pack()实际上将窗口大小设置为其首选大小。在使窗口可见之前,通常应该调用此方法。您可以稍后调用它,但这会给用户带来奇怪的体验(我不知道很多应用程序会在显示后调整窗口大小)
  4. 使用revalidate()repaint()的主要优点是它们可以合并自己。这意味着如果您多次调用repaint(),则只会执行一次绘画。