Java Swing:重绘()与无效[重复]

Posted

技术标签:

【中文标题】Java Swing:重绘()与无效[重复]【英文标题】:Java Swing: repaint() vs invalidate [duplicate] 【发布时间】:2011-05-22 17:56:21 【问题描述】:

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

大家好

我正在与我的程序作斗争,以使其在正确的时间刷新。

并没有取得很大的成功,哈哈

我有 2 个问题

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

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

【问题讨论】:

我不会说“无效”和“重新验证”是一回事。 【参考方案1】:

Q1:我应该使用哪个 界面已更改:重新绘制或 无效?

如果由于调整大小、字体更改等原因导致布局不是最新的,那么您应该调用 invalidate。使组件无效,使该组件无效,并且它上面的所有父级都被标记为需要布局。在绘制之前,在验证步骤中,如果没有发现任何变化,则省略绘制步骤。

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

Q2:应该什么时候调用它们?

Invalidate(): 将组件标记为无效——这意味着,它的布局是或可能不再是“最新的”:即调整组件的大小、添加边框、更改字体等等。你应该永远不需要手动调用 invalidate(),因为在每次属性更改时,swing 都会为您执行此操作。

当控件内有多个区域需要重绘时,Invalidate 会导致整个窗口一次重绘,避免重复重绘导致的闪烁。在实际重绘控件之前多次调用 Invalidate 不会造成性能损失。

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

也看看Update方法。

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

有关如何在 AWT 和 Swing 中完成绘画的绝佳链接,请参阅下面的链接:

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

希望这会有所帮助。

【讨论】:

在处理 JComponents 时,请使用 revalidate() 而不是 invalidate(),以确保在适当的情况下使整个组件层次结构失效(另请参阅 ***.com/questions/859493/…)

以上是关于Java Swing:重绘()与无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing上的图形界面无法正常工作[重复]

swing更改组件(删除后添加)得到心得:起码得刷新一下啊,可能还得再考虑重绘

java swing JTextField设置PlaceHolder [重复]

java swing JTextField设置PlaceHolder [重复]

Java Swing TextArea“粘性文本”[重复]

Swing组件响应事件与自身重绘