我正在组合一个Swing应用程序,我经常想在其中替换JPanel的内容。为此,我调用removeAll(),然后添加新内容,然后调用revalidate()。
然而,我发现旧的内容仍然是可见的(尽管被新内容所掩盖)。如果我在revalidate()之外添加一个repaint()调用,它会像预期的那样工作。
我确信在其他情况下,我只调用revalidate()就足够了。
所以基本上我的问题是,我是否需要调用这两个函数,如果不需要,什么时候调用它们?
我正在组合一个Swing应用程序,我经常想在其中替换JPanel的内容。为此,我调用removeAll(),然后添加新内容,然后调用revalidate()。
然而,我发现旧的内容仍然是可见的(尽管被新内容所掩盖)。如果我在revalidate()之外添加一个repaint()调用,它会像预期的那样工作。
我确信在其他情况下,我只调用revalidate()就足够了。
所以基本上我的问题是,我是否需要调用这两个函数,如果不需要,什么时候调用它们?
当前回答
是的,你需要打电话 重画(); 重新验证(); 当你调用removeAll()时,你必须调用repaint()和revalidate()
其他回答
每次执行remove()或removeAll()时,都应该调用
validate();
repaint();
在您完成add()添加新组件之后。
在执行remove()时,必须调用validate()或revalidate() -请参阅相关javadocs。
我自己的测试表明,repaint()也是必要的。我不确定具体原因。
一旦添加了新组件或删除了旧组件,就会在容器上调用Revalidate。这个调用是一个指令,告诉布局管理器根据新的组件列表进行重置。Revalidate将触发一个调用,重新绘制组件认为是“脏区域”的区域。显然,并非你的JPanel上的所有区域都被RepaintManager认为是脏的。
Repaint用于告诉组件重新绘制自身。通常情况下,您需要调用这个函数来清理像您这样的情况。
您需要调用repaint()和revalidate()。前者告诉Swing窗口的某个区域是脏的(这对于擦除被removeAll()删除的旧子进程的图像是必要的);后者告诉布局管理器重新计算布局(这在添加组件时是必要的)。这应该会导致面板的子面板重绘,但可能不会导致面板本身这样做(请参阅重绘触发器列表)。
在一个更普遍的注意:而不是重用原来的面板,我建议构建一个新的面板并在父面板上交换它们。
是的,你需要打电话 重画(); 重新验证(); 当你调用removeAll()时,你必须调用repaint()和revalidate()
Revalidate()只是请求对容器进行布局,当你经历过简单地调用Revalidate()工作时,这可能是由于更新子组件的边界触发repaint(),当它们的边界在重新布局期间发生变化时。在你提到的情况下,只有组件被移除,没有组件边界被改变,这种情况下没有repaint()被“意外”触发。