Java Swing revalidate()与repaint()

tmb3ates  于 2023-03-21  发布在  Java
关注(0)|答案(5)|浏览(269)

我正在构建一个Swing应用程序,我经常想替换JPanel的内容。为此,我调用removeAll(),然后添加新内容,然后调用revalidate()
但是我发现旧的内容实际上仍然可见(尽管被新的内容掩盖了)。如果我在revalidate()之外添加对repaint()的调用,它会像预期的那样工作。
我相信在其他情况下,我经历过,只是调用revalidate()就足够了。
所以基本上我的问题是--我应该调用这两个函数吗?如果不需要,我应该什么时候调用它们?

ccrfmcuu

ccrfmcuu1#

你需要调用repaint()revalidate()。第一个告诉Swing窗口的某个区域是脏的(这是擦除removeAll()删除的旧子对象的图像所必需的);第二个命令告诉布局管理器重新计算布局(这在添加组件时是必要的)。这应该会导致面板的子面板重绘,但可能不会导致面板本身重绘(请参阅重绘触发器列表)。
更一般地说:与其重用原来的面板,我建议构建一个新的面板并在父面板上交换它们。

uqxowvwt

uqxowvwt2#

无论何时执行remove()或removeAll(),都应该调用

validate();
  repaint();

完成添加()新组件后。
在执行remove()时,调用validate()或revalidate()是强制性的-请参阅相关的javadoc。
我自己的测试表明repaint()也是必要的,我不确定为什么。

bgibtngc

bgibtngc3#

revalidate在容器上被调用,一旦添加新的组件或删除旧的组件。这个调用是一个指令,告诉布局管理器根据新的组件列表重置。revalidate将触发一个调用,重新绘制组件认为是“脏区域”的区域。显然,不是JPanel上的所有区域都被RepaintManager认为是脏的。
repaint用于告诉组件重绘自身。通常情况下,您需要调用此函数来清除像您这样的条件。

o0lyfsai

o0lyfsai4#

revalidate()只是请求布局容器,当你遇到简单的调用revalidate()就可以工作的情况时,可能是因为在重新布局的过程中,子组件的边界发生了变化,子组件的边界更新触发了repaint()。在你提到的情况下,只删除了组件,没有改变组件的边界,这种情况下没有repaint()被**“意外”**触发。

mv1qrgav

mv1qrgav5#

你需要调用repaint();return();当你调用removeAll()时,你必须调用repaint()和revalidate()

相关问题