Swing刷新周期

kot*_*oko 5 java swing refresh repaint

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

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

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

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

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

此跟踪表示要生效或不生效与LayoutManager相关联.而这完全取决于组件的大小而不是内容.

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

Gui*_*let 6

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

  1. 你应该叫revalidate()一个容器上,当你可以:添加一个或多个组件,删除一个或多个组件,改变一个或多个内含成分的限制(限制或XXXSize(),尽管后者不推荐),改变了LayoutManager的容器.
  2. 您应该repaint()在需要重新绘制该组件(及其后代)时调用.最终,这将调用paintComponent()(对于基本小部件,它将委托给XXXUI.paint()),paintBorder()并且paintChildren()(至少在Swing中)
  3. pack()实际上将窗口的大小设置为其首选大小.在使窗口可见之前,通常应该调用此方法.您可以稍后调用它,但这会产生奇怪的用户体验(我不知道很多应用程序一旦显示就会调整其窗口大小)

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