我将一个Swing应用程序放在一起,我经常想替换JPanel的内容。为此,我先打电话removeAll(),然后添加我的新内容,然后打电话revalidate()。
removeAll()
revalidate()
但是我发现旧内容实际上仍然可见(尽管被新内容遮盖了)。如果我repaint()除了添加呼叫revalidate(),则按预期运行。
repaint()
我敢肯定,在其他情况下,我经历过仅打个电话revalidate()就足够了。
所以基本上我的问题是-我应该同时调用这两个函数吗?如果不需要,什么时候应分别调用它们?
你需要致电repaint()和revalidate()。前者告诉Swing窗口的某个区域很脏(这对于擦除被删除的大孩子的图像是必需的removeAll());后者告诉布局管理器重新计算布局(添加组件时这是必需的)。这应当引起孩子的面板重新绘制,但可能不会导致面板本身这样做(见这对于重绘触发的列表)。
笼统地说:建议不要建立原始面板,而建议建立一个新面板并在父面板上交换它们。