[英]Java Swing revalidate() vs repaint()
我将一个Swing应用程序放在一起,我经常想替换JPanel的内容。 为此,我调用removeAll()
,然后添加新内容,然后调用revalidate()
。
但是我发现旧内容实际上仍然可见(尽管被新内容遮盖了)。 如果我除了revalidate()
之外还添加了对repaint()
的调用,它将按预期工作。
我确信在其他情况下,我经历过仅调用revalidate()
就足够了。
因此,基本上我的问题是-我需要同时调用这两个函数吗?如果不需要,何时应分别调用它们?
您需要调用repaint()
和revalidate()
。 前者告诉Swing窗口的区域很脏(这对于擦除由removeAll()
删除的旧孩子的图像是必需的); 后者告诉布局管理器重新计算布局(添加组件时这是必需的)。 这应该会导致面板重绘的孩子 ,但可能不会导致面板本身这样做(见这对于重绘触发的列表)。
总的来说,我建议不要建立原始面板,而建议重新构建面板,并在父面板上交换它们。
每当您执行remove()或removeAll()时,都应调用
validate();
repaint();
完成add()后,添加新组件。
执行remove()时必须调用validate()或revalidate()-请参阅相关的Javadocs。
我自己的测试表明repaint()也是必需的。 我不确定为什么。
一旦添加了新组件或删除了旧组件,就会在容器上调用revalidate
。 该调用是告诉布局管理器根据新组件列表进行重置的指令。 revalidate
将触发调用以重绘组件认为是“脏区”的内容。 显然, RepaintManager
不会将JPanel
上的所有区域都视为脏RepaintManager
。
repaint
用于告诉组件重绘自身。 通常情况下,您需要调用此命令来清理诸如您的情况。
revalidate()
只是请求对容器进行布局,当您体验简单地调用revalidate()
,可能是由于子组件边界的更新在重新布局期间更改其边界而触发repaint()
时引起的。 在您提到的情况下,仅删除了组件并且没有更改组件边界,在这种情况下,不会“意外”触发repaint()
。
是的,您需要调用repaint();。 revalidate(); 当您调用removeAll()时,您必须调用repaint()和revalidate()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.