Swing GUI中validate(),revalidate()和invalidate()之间的区别


111

Swing组件具有与屏幕布局更新有关的多种方法,尤其是:

Java文档从技术角度对这些进行了一些定义,但是尚不清楚如何使用它们。

两者之间有什么区别,在什么情况下应使用一种而不是其他方式?

Answers:


67

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();
        }
    }
}

3
revalidate()不调用doLayout(),而是调用validate()。因此,这实际上不是两者的总和- revalidate并非始终是的有效替代validate
Meo

这是AWT,这是怎么样的重新验证容貌的摇摆:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/...
梅奥

在这种情况下,我猜想(从未尝试过)RepaintManager将调用validate
StanislavL

我正在处理一个丑陋的错误,并用validate(称为doLayout)替换revalidate解决了它……
Meo

我们如何从静态方法调用validate()?
Kunal Tyagi

69

validate():在Swing中,当您创建组件时,它不是,valid即其有效属性是false。确定组件的宽度,高度,位置和填充物后,该组件即为有效组件。这通常是通过validate()直接或间接调用其方法来完成的。当我们调用validate()容器时,它将通过调用其doLayout()方法来验证容器(如果无效),该方法通常会调用LayoutManager。现在,将对每个放置在此容器上的孩子进行递归验证,以便整个树都将被布局并变得有效。

revalidate()revalidate()在更改会影响其宽度/高度的属性时调用;在更改会影响其外观的属性时调用repaint()。例如,如果您JFrame包含一个JPanel,现在在某个时间点将其删除,JPanel然后在其位置插入一个新的,具体取决于新放置的内容,JPanel组件内部JPanel以及The CONTAINER自身的大小(根据所使用的布局管理器的名称)。将其推到无效状态。因此,为了验证此更改,您必须显式调用revalidate()

invalidate():这是我从未使用过的东西,因此可能没有太多信息可以提供。但是似乎上面介绍的场景可以给您一些提示,说明使用时会发生什么invalidate()


1
我相信invalidate()在您更新几个组件并在最终使用revalidate()or 重新计算布局之前将它们标记为无效时很有用validate()
Qix-蒙尼卡(Monica)

1
@Qix:恕我直言,因为它是自动调用的,所以无需调用invalidate()。此外,revalidate()本身将完成该任务(如Java Docs中所述,它是调用invalidate ()和的便捷方法validate ())。
尼斯牛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.