我正在构建一个Swing应用程序,我经常想替换JPanel的内容。为此,我调用removeAll(),然后添加新内容,然后调用revalidate()。但是我发现旧的内容实际上仍然可见(尽管被新的内容掩盖了)。如果我在revalidate()之外添加对repaint()的调用,它会像预期的那样工作。我相信在其他情况下,我经历过,只是调用revalidate()就足够了。所以基本上我的问题是--我应该调用这两个函数吗?如果不需要,我应该什么时候调用它们?
removeAll()
revalidate()
repaint()
ccrfmcuu1#
你需要调用repaint()和revalidate()。第一个告诉Swing窗口的某个区域是脏的(这是擦除removeAll()删除的旧子对象的图像所必需的);第二个命令告诉布局管理器重新计算布局(这在添加组件时是必要的)。这应该会导致面板的子面板重绘,但可能不会导致面板本身重绘(请参阅重绘触发器列表)。更一般地说:与其重用原来的面板,我建议构建一个新的面板并在父面板上交换它们。
uqxowvwt2#
无论何时执行remove()或removeAll(),都应该调用
validate(); repaint();
完成添加()新组件后。在执行remove()时,调用validate()或revalidate()是强制性的-请参阅相关的javadoc。我自己的测试表明repaint()也是必要的,我不确定为什么。
bgibtngc3#
revalidate在容器上被调用,一旦添加新的组件或删除旧的组件。这个调用是一个指令,告诉布局管理器根据新的组件列表重置。revalidate将触发一个调用,重新绘制组件认为是“脏区域”的区域。显然,不是JPanel上的所有区域都被RepaintManager认为是脏的。repaint用于告诉组件重绘自身。通常情况下,您需要调用此函数来清除像您这样的条件。
revalidate
JPanel
RepaintManager
repaint
o0lyfsai4#
revalidate()只是请求布局容器,当你遇到简单的调用revalidate()就可以工作的情况时,可能是因为在重新布局的过程中,子组件的边界发生了变化,子组件的边界更新触发了repaint()。在你提到的情况下,只删除了组件,没有改变组件的边界,这种情况下没有repaint()被**“意外”**触发。
mv1qrgav5#
你需要调用repaint();return();当你调用removeAll()时,你必须调用repaint()和revalidate()
5条答案
按热度按时间ccrfmcuu1#
你需要调用
repaint()
和revalidate()
。第一个告诉Swing窗口的某个区域是脏的(这是擦除removeAll()
删除的旧子对象的图像所必需的);第二个命令告诉布局管理器重新计算布局(这在添加组件时是必要的)。这应该会导致面板的子面板重绘,但可能不会导致面板本身重绘(请参阅重绘触发器列表)。更一般地说:与其重用原来的面板,我建议构建一个新的面板并在父面板上交换它们。
uqxowvwt2#
无论何时执行remove()或removeAll(),都应该调用
完成添加()新组件后。
在执行remove()时,调用validate()或revalidate()是强制性的-请参阅相关的javadoc。
我自己的测试表明repaint()也是必要的,我不确定为什么。
bgibtngc3#
revalidate
在容器上被调用,一旦添加新的组件或删除旧的组件。这个调用是一个指令,告诉布局管理器根据新的组件列表重置。revalidate
将触发一个调用,重新绘制组件认为是“脏区域”的区域。显然,不是JPanel
上的所有区域都被RepaintManager
认为是脏的。repaint
用于告诉组件重绘自身。通常情况下,您需要调用此函数来清除像您这样的条件。o0lyfsai4#
revalidate()
只是请求布局容器,当你遇到简单的调用revalidate()
就可以工作的情况时,可能是因为在重新布局的过程中,子组件的边界发生了变化,子组件的边界更新触发了repaint()
。在你提到的情况下,只删除了组件,没有改变组件的边界,这种情况下没有repaint()
被**“意外”**触发。mv1qrgav5#
你需要调用repaint();return();当你调用removeAll()时,你必须调用repaint()和revalidate()