Java Swing:repaint()与invalidate

Java Swing:repaint()与invalidate,java,swing,Java,Swing,可能重复: 大家好 我正在努力让程序在正确的时间刷新 而且没有太多的成功,哈哈 我有两个问题 问题1:当我的界面发生变化时,我应该使用哪一种:重新绘制还是无效 问题2:什么时候应该给他们打电话?我知道这听起来很愚蠢,但实际上我遇到了问题,因为SwingWorker和其他线程操作 问题1:当我的 接口已更改:重新绘制或 无效 如果布局由于大小调整、字体更改等原因而不是最新的,则应调用invalidate。使组件无效,将使组件无效,其上的所有父级都标记为需要布局。在喷漆之前,在验证步骤中,如果未发

可能重复:

大家好

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

而且没有太多的成功,哈哈

我有两个问题

问题1:当我的界面发生变化时,我应该使用哪一种:重新绘制还是无效

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

问题1:当我的 接口已更改:重新绘制或 无效

如果布局由于大小调整、字体更改等原因而不是最新的,则应调用invalidate。使组件无效,将使组件无效,其上的所有父级都标记为需要布局。在喷漆之前,在验证步骤中,如果未发现任何变化,则省略喷漆步骤

如果有一部分组件正在更新(由图形的剪辑矩形定义,称为<强>损坏的“< /强>区域”),那么您应该考虑调用RePr漆。可能出现损坏区域的原因之一是由于某些其他组件或应用程序导致组件的一部分重叠。 根据我的经验,如果在最里面的封闭组件上调用repait(),则repait()更有效(即使用

公共void repait(int x,int y,int width,int height)
,而不是使用公共
void repait()

问题2:什么时候应该给他们打电话

Invalidate():
将组件标记为无效--这意味着,它的布局已经或可能不再是“最新的”:即,组件的大小已调整,添加了边框,字体更改等。您不需要手动调用Invalidate(),因为swing在几乎每次属性更改时都会为您这样做

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

Repaint():
如果组件是轻量级组件,此方法会导致尽快调用此组件的绘制方法。否则,此方法会导致尽快调用此组件的更新方法

还要查看
Update
方法

注意:Swing以与AWT稍有不同的方式处理“重新绘制”请求,尽管应用程序程序员的最终结果基本相同——调用了paint()

有关如何在AWT和Swing中进行喷漆的出色链接,请参阅下面的链接:


希望这会有所帮助。

在处理JComponents时,使用
revalidate()
而不是
invalidate()
,以确保在适当的情况下使整个组件层次结构无效(另请参见)。我不会说“invalidate”和“revalidate”是同一回事。