Java Swing重新validation()vs repaint()

我正在放置一个Swing应用程序,我经常要replaceJPanel的内容。 为此,我调用removeAll() ,然后添加我的新内容,然后调用revalidate()

但是我发现旧内容仍然是可见的(虽然被新内容遮蔽了)。 如果除了revalidate()之外,还要调用repaint() revalidate() ,它将按预期工作。

我确信在其他场合,我只是调用revalidate()就足够了。

所以基本上我的问题是 – 我是否需要调用这两个函数?如果不是,我应该什么时候调用它们?

你需要调用repaint()revalidate() 。 前者告诉Swing,该窗口的一个区域是脏的(这是必要的,以删除removeAll()删除的旧的孩子的图像); 后者告诉布局pipe理器重新计算布局(添加组件时这是必要的)。 这应该导致面板的孩子重新绘画,但可能不会导致面板本身这样做(请参阅重绘触发器的列表)。

在一个更一般的说明:而不是重用原来的面板,我build议build立一个新的面板,并交换在父母。

任何时候你做一个remove()或者removeAll(),你都应该调用

  validate(); repaint(); 

在完成添加()新组件之后。

在执行remove()时,调用validate()或revalidate()是必需的 – 请参阅相关的javadoc。

我自己的testing表明repaint()也是必要的。 我不确定为什么。

一旦添加新组件或删除旧组件,就会在容器上调用revalidate 。 这个调用是一个指令,告诉布局pipe理器根据新的组件列表进行重置。 revalidate将触发一个调用,重新绘制组件认为是“脏区域”。 显然,并不是你的JPanel中的所有区域都被RepaintManager认为是脏的。

repaint是用来告诉组件重绘自己。 通常情况下,你需要调用这个来清理你的条件。

revalidate()只是请求布局容器,当你经历过简单地调用revalidate()的工作,它可能是由更新子组件边界引起的,当重新布局期间边界被改变时,边界触发repaint()。 在你提到的情况下,只有组件被删除,没有组件边界被改变,这种情况下,没有repaint()被“意外”触发。

是的,你需要调用repaint(); 重新validation(); 当你调用removeAll()时,你必须调用repaint()和revalidate()