Java Swing重新验证()与重新绘制()的比较

Java Swing重新验证()与重新绘制()的比较,java,swing,Java,Swing,我正在组装一个Swing应用程序,我经常想替换JPanel的内容。为此,我要调用removeAll(),然后添加新内容,然后调用revalidate() 然而,我发现旧的内容仍然是可见的(尽管被新的内容掩盖了)。如果我在revalidate()之外添加对repaint()的调用,它将按预期工作 我敢肯定,在其他情况下,只要调用revalidate()就足够了 所以基本上我的问题是-我应该调用这两个函数吗?如果不是,我应该什么时候调用它们?你需要调用repaint()和revalidate()。前

我正在组装一个Swing应用程序,我经常想替换JPanel的内容。为此,我要调用
removeAll()
,然后添加新内容,然后调用
revalidate()

然而,我发现旧的内容仍然是可见的(尽管被新的内容掩盖了)。如果我在
revalidate()
之外添加对
repaint()
的调用,它将按预期工作

我敢肯定,在其他情况下,只要调用
revalidate()
就足够了


所以基本上我的问题是-我应该调用这两个函数吗?如果不是,我应该什么时候调用它们?

你需要调用
repaint()
revalidate()
。前者告诉Swing窗口的一个区域是脏的(这是擦除由
removeAll()
移除的旧儿童图像所必需的);后者告诉布局管理器重新计算布局(这在添加组件时是必要的)。这将导致面板的子级重新绘制,但可能不会导致面板本身重新绘制(有关重新绘制触发器的列表,请参阅)


更一般地说:我建议构建一个新面板并在父级交换它们,而不是重复使用原始面板。

revalidate
在添加新组件或删除旧组件后在容器上调用。此调用指示布局管理器根据新元件列表重置
revalidate
将触发一个调用,以重新绘制组件认为是“脏区域”的区域。
repaitmanager
显然不会将
JPanel
上的所有区域都视为脏区域

重新绘制
用于通知组件重新绘制自身。通常情况下,您需要调用此函数来清除条件,例如您的条件。

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

  validate();
  repaint();
完成添加新组件后

执行remove()时,必须调用validate()或revalidate()-请参阅相关的javadocs

我自己的测试表明repaint()也是必要的。我不知道确切的原因。

是的,你需要打电话 重新油漆(); 重新验证();
当您调用removeAll()时,您必须调用repaint()和revalidate()

revalidate()
仅请求布局容器,当您只需调用
revalidate()
在重新布局期间更改其边界时。在您提到的情况下,只有组件被删除,并且没有组件边界被更改,这种情况下,
repaint()
不会被“意外地”触发。

声明:“总是在重新验证后调用repaint”。但是没有提供任何解释。你能解释为什么构建新面板比使用旧面板更好吗?:)@Arttu-它的工作量更少,因此更不容易出错。