Java Swing:repaint()vs invalidate

Jas*_*ers 13 java swing

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

大家好

我正在与我的程序斗争,以便在正确的时间刷新它.

并没有很多成功哈哈

我有两个问题

Q1:当界​​面发生变化时我应该使用哪个:重绘还是无效?

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

Fav*_*ius 25

Q1:当界​​面发生变化时我应该使用哪个:重绘还是无效?

如果由于调整大小,字体更改等布局不是最新的,那么您应该调用invalidate.使组件无效,使组件无效,并将其上方的所有父项标记为需要布局.在绘画之前,如果没有找到任何变化,则在验证步骤中,省略绘画步骤.

如果组件的某些部分正在更新(由图形的剪辑矩形定义,称为"损坏"区域),那么您应该考虑调用重绘.可能发生损坏区域的原因之一是由于某些其他组件或应用程序而导致组件的一部分重叠.根据我的经验,如果你在最里面的封闭组件上调用它(即使用public void repaint(int x, int y, int width, int height)而不是使用public void repaint()),repaint()会更有效.

Q2:什么时候应该打电话?

Invalidate(): 将组件标记为无效 - 这意味着它的布局是或者可能不是"最新":即组件调整大小,添加边框,更改字体等等,您永远不需要调用invalidate( )手动,因为摆动对你来说几乎每次改变财产都是如此.

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

Repaint() :如果组件是轻量级组件,则此方法会尽快调用此组件的paint方法.否则,此方法会尽快调用此组件的更新方法.

还看看Update方法.

注意: Swing进程以与AWT略有不同的方式"重绘"请求,尽管应用程序员的最终结果基本相同 - 调用了paint().

请参阅下面的链接,了解如何在AWT和Swing中完成绘画:

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

希望这会有所帮助.