这个问题已经在这里有了答案:
已关闭10年。
大家好
我正在与我的程序作斗争,以使其在正确的时间刷新。
而且没有很多成功大声笑
我有两个问题
问题1:界面更改后应该使用哪个:重新绘制或无效?
Q2:什么时候应该调用它们?我知道这听起来很愚蠢,但是由于SwingWorker和其他线程操作,我实际上遇到了问题。
最佳答案
如果由于调整大小,更改字体等原因导致布局不是最新的,则应调用invalidate。使组件无效,使该组件无效并且其上方的所有父项均标记为需要布置。在绘制之前,如果在验证步骤中未找到任何更改,则省略绘制步骤。
如果组件的某个部分正在更新(由图形的剪辑矩形定义,称为“已损坏”的区域),则应考虑调用重绘。可能发生损坏区域的原因之一是由于某些其他组件或应用程序而导致的一部分组件重叠。
根据我的经验,如果您在最里面的封闭组件上调用repaint()会更有效(即使用public void repaint(int x, int y, int width, int height)
而不是使用public void repaint()
)。
Invalidate():
将组件标记为无效–这意味着其布局是否为“最新”:即,调整组件的大小,添加边框,更改字体等,您永远不需要调用invalidate ()手动操作,因为每次更改属性后,挥杆 Action 几乎都能为您带来帮助。
当控件中的多个区域需要重新绘制时,Invalidate将使整个窗口在一次通过中重新绘制,从而避免了由于冗余重新绘制而引起的闪烁。在实际重绘控件之前多次调用Invalidate不会对性能造成任何影响。Repaint() :
如果该组件是轻量级组件,则此方法导致尽快调用此组件的paint方法。否则,此方法将导致尽快调用此组件的update方法。
也可以看看Update
方法。
注意: Swing处理“重绘”请求的方式与AWT稍有不同,尽管应用程序程序员的最终结果基本上是相同的-调用paint()。
请参阅以下链接,以获得有关如何在AWT和Swing中完成绘画的出色链接:
http://www.oracle.com/technetwork/java/painting-140037.html
希望这会有所帮助。
关于java - Java Swing : repaint() vs invalidate [duplicate],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4396583/