繁体   English   中英

Java Swing revalidate()与repaint()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM