Java Swing:repaint()与invalidate()的区别

16

可能是重复问题:
Java Swing revalidate() vs repaint()

大家好

我正在努力让我的程序在正确的时间刷新。

但是并没有太多成功的经验笑。

我有两个问题

问题1:当我的界面发生变化时,应该使用repaint还是invalidate?

问题2:什么时候应该调用它们?我知道这听起来很愚蠢,但我实际上因为SwingWorker和其他线程操作而遇到了问题。


我不会说“invalidate”和“revalidate”是同一件事。 - Stevens Miller
1个回答

28

问1:当我的界面发生改变时,我应该使用repaint还是invalidate?

如果布局因调整大小、更改字体等而不再更新,则应调用invalidate。将组件标记为无效后,其所有父级都将被标记为需要进行布局。在验证步骤中,如果没有更改,则在绘制之前跳过绘制步骤。

如果正在更新组件的某个部分(由图形的剪辑矩形定义,称为“损坏”区域),则应考虑调用repaint。导致损坏区域出现的原因之一是由于其他组件或应用程序的重叠而导致您的组件的某个部分。根据我的经验,如果在最内层封闭组件上调用repaint(即使用public void repaint(int x, int y, int width, int height)而不是使用public void repaint()),效果更好。

问2:什么时候应该调用它们?

invalidate(): 将组件标记为无效 - 这意味着,它的布局可能已经不再“最新”,例如:组件被调整大小、添加边框、更改字体等等。你不需要手动调用invalidate(),因为Swing几乎在每个属性更改时都会为你调用该方法。

当控件内部的多个区域需要被重绘时,Invalidate将导致整个窗口在单个过程中重绘,避免了由于冗余重绘引起的闪烁。在控件实际重绘之前,多次调用Invalidate不会有性能损失。

repaint(): 如果组件是轻量级组件,则此方法会尽快调用此组件的paint方法。否则,此方法会尽快调用此组件的update方法。

还请查看Update方法。

注意: Swing 对 "repaint" 请求的处理方式与 AWT 稍有不同,尽管最终对应用程序员而言结果基本相同--都会调用 paint() 方法。

请参考以下链接,了解 AWT 和 Swing 中如何进行绘制的详细信息:

http://www.oracle.com/technetwork/java/painting-140037.html

希望这能帮到您。


处理JComponents时,请使用 revalidate() 而不是 invalidate(),以确保在适当的位置无效整个组件层次结构(另请参见https://dev59.com/qkfRa4cB1Zd3GeqP-JJ9)。 - Jelle Fresen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接