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