Java Swing:repaint()vs invalidate

时间:2010-12-09 09:20:44

标签: java swing

  

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

大家好

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

没有很多成功lol

我有两个问题

Q1:我的界面发生变化时应该使用哪个:重绘或无效?

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

1 个答案:

答案 0 :(得分:25)

  

Q1:我应该使用哪个   界面发生了变化:重绘或   无效?

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

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

  

Q2:什么时候应该被召唤?

Invalidate():标记组件无效 - 这意味着它的布局是或者可能不是“最新”:即组件调整大小,添加边框,更改字体等。你永远不需要手工调用invalidate(),因为swing会为你做几乎所有的属性更改。

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

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

另请查看Update方法。

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

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

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

希望这会有所帮助。