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()