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() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swing 中实现动态 GUI

用Swing开发GUI程序(基础知识)

java GUI编程(swing)之三swing单选框复选框组件

java GUI编程(swing)之一 swing简单介绍

java GUI编程(swing)之二swing按钮组件

如何最好地定位 Swing GUI?