Swing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别
Posted
技术标签:
【中文标题】Swing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别【英文标题】:Difference between validate(), revalidate() and invalidate() in Swing GUI 【发布时间】:2012-03-19 14:07:25 【问题描述】:Swing 组件有多种与屏幕布局更新相关的方法,特别是:
validate()
invalidate()
revalidate()
Java 文档从技术角度对这些进行了一定程度的定义,但并不清楚它们的用途。
这些有什么区别,在什么情况下你应该使用其中一个而不是其他的?
【问题讨论】:
【参考方案1】:invalidate()
将容器标记为无效。表示内容在某种程度上是错误的,必须重新布局。但这只是一种标记/标志。可能需要稍后刷新多个无效容器。
validate()
执行重新布局。这意味着所有尺寸都要求无效内容,并且所有子组件的尺寸都由 LayoutManager 设置为适当的值。
revalidate()
只是两者的总和。它将容器标记为无效并执行容器的布局。
更新:
来自 Component.java 的一些代码
public void revalidate()
revalidateSynchronously();
/**
* Revalidates the component synchronously.
*/
final void revalidateSynchronously()
synchronized (getTreeLock())
invalidate();
Container root = getContainer();
if (root == null)
// There's no parents. Just validate itself.
validate();
else
while (!root.isValidateRoot())
if (root.getContainer() == null)
// If there's no validate roots, we'll validate the
// topmost container
break;
root = root.getContainer();
root.validate();
【讨论】:
revalidate()
不会调用doLayout()
,而validate()
会调用。所以它并不是两者的总和 - revalidate
并不总是有效替代 validate
。
那是 AWT 的,这就是 Swing 的重新验证的样子:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
在这种情况下,我猜(从未尝试过)RepaintManager 会调用 validate
我正在处理一个丑陋的错误并用 validate(调用 doLayout)替换 revalidate 解决了它......
我们如何从静态方法调用 validate()?【参考方案2】:
validate()
:在 Swing 中,当你创建一个组件时,它不是valid
,即它的有效属性是false
。当组件的宽度、高度、位置和内容已确定时,该组件被称为有效。这通常通过直接或间接调用他们的validate()
方法来完成。当我们在容器上调用validate()
时,它将通过调用其doLayout()
方法来验证容器(如果它无效),该方法通常会调用LayoutManager
。现在放置在这个容器上的每个子节点都将被递归验证,这样整个树就会被布局并变得有效。
revalidate()
: revalidate()
将在您更改会影响其宽度/高度的属性时调用,并在您更改会影响其外观的属性时调用 repaint()。
例如,如果您的JFrame
包含一个JPanel
,现在在某个时间点您删除了该JPanel
并在其位置插入了一个新的,具体取决于新放置的JPanel
的内容,大小JPanel
内部的组件以及 The CONTAINER
本身(通过它使用的布局管理器)发生了变化。这会将其推向无效状态。因此,为了验证此更改,您必须显式调用 revalidate()
。
invalidate()
:这是我从未使用过的东西,所以我可能无法提供太多关于它的信息。但似乎上面介绍的场景可以提供一些提示,即使用invalidate()
时会发生什么。
【讨论】:
我相信invalidate()
在您更新多个组件并希望在最终使用revalidate()
或validate()
重新计算布局之前将它们标记为无效时很有用。
@Qix:恕我直言,没有必要打电话给invalidate (),因为它会被自动调用。此外,revalidate () 本身将执行该任务(如 Java 文档中所述,它充当调用 invalidate ()
和 validate ()
的便捷方法。以上是关于Swing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章