【问题标题】:Difference between validate(), revalidate() and invalidate() in Swing GUISwing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别
【发布时间】:2012-03-19 14:07:25
【问题描述】:

Swing 组件有多种与屏幕布局更新相关的方法,特别是:

Java 文档从技术角度对这些进行了一定程度的定义,但并不清楚它们的用途。

这些有什么区别,在什么情况下你应该使用其中一个而不是其他的?

【问题讨论】:

    标签: java swing user-interface


    【解决方案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 () 的便捷方法。
    猜你喜欢
    • 2013-08-11
    • 2015-11-11
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多