Java Swing:repaint()vs invalidate
可能重复:
Java Swing revalidate()vs repaint()
大家好
我正在与我的程序斗争,以便在正确的时间刷新它。
并没有很多成功哈哈
我有两个问题
Q1:当我的界面发生变化时,我应该使用哪个:重绘还是无效?
Q2:他们应该什么时候打电话? 我知道这听起来很愚蠢,但由于SwingWorker和其他线程操作,我实际上遇到了问题。
Q1:当我的界面发生变化时,我应该使用哪个:重绘还是无效?
如果由于resize,字体更改等布局不是最新的,那么您应该调用invalidate。 使组件无效,使组件无效,并将其上方的所有父项标记为需要布局。 在绘画之前,如果没有发现任何变化,则在validation步骤中,省略绘画步骤。
如果组件的某些部分正在更新(由图形的剪辑矩形定义,称为“损坏”区域),那么您应该考虑调用重绘。 可能发生损坏区域的原因之一是由于某些其他组件或应用程序而导致组件的一部分重叠。 根据我的经验,如果在最内层的封闭组件上调用它(即使用public void repaint(int x, int y, int width, int height)
而不是使用public void repaint()
),则repaint()会更有效。
Q2:他们应该什么时候打电话?
Invalidate():
将组件标记为无效 – 这意味着它的布局是或者可能不再是“最新”:即组件resize,添加边框,更改字体等等,您永远不需要手动调用invalidate(),因为swing几乎为每个属性更改而为你做。
当控件中的多个区域需要重新绘制时,Invalidate将导致整个窗口在一次通过中重新绘制,从而避免冗余重绘造成的闪烁。 在实际重新绘制控件之前多次调用Invalidate没有性能损失。
Repaint() :
如果组件是轻量级组件,则此方法会尽快调用此组件的paint方法。 否则,此方法会尽快调用此组件的更新方法。
另请看一下Update
方法。
注意: Swing进程以与AWT略有不同的方式“重绘”请求,尽管应用程序员的最终结果基本相同 – 调用了paint()。
请参阅下面的链接,了解如何在AWT和Swing中完成绘画:
http://www.oracle.com/technetwork/java/painting-140037.html
希望这会有所帮助。