Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing GUI中validate()、revalidate()和invalidate()之间的差异_Java_Swing_User Interface - Fatal编程技术网

Java Swing GUI中validate()、revalidate()和invalidate()之间的差异

Java Swing GUI中validate()、revalidate()和invalidate()之间的差异,java,swing,user-interface,Java,Swing,User Interface,Swing组件有多种与屏幕布局更新相关的方法,特别是: Java文档从技术的角度对它们进行了定义,但并不清楚它们是如何使用的 它们之间有什么区别,在什么情况下应该使用其中一个而不是其他的?无效将容器标记为无效。意味着内容有点错误,必须重新布局。但它只是一种标记/旗帜。可能以后必须刷新多个无效容器 验证执行重新调整。这意味着对所有大小请求无效内容,并且LayoutManager将所有子组件的大小设置为正确的值 重新验证日期只是两者的总和。它将容器标记为无效,并执行容器布局 更新: 来自Compon

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

Java文档从技术的角度对它们进行了定义,但并不清楚它们是如何使用的

它们之间有什么区别,在什么情况下应该使用其中一个而不是其他的?

无效将容器标记为无效。意味着内容有点错误,必须重新布局。但它只是一种标记/旗帜。可能以后必须刷新多个无效容器

验证执行重新调整。这意味着对所有大小请求无效内容,并且LayoutManager将所有子组件的大小设置为正确的值

重新验证日期只是两者的总和。它将容器标记为无效,并执行容器布局

更新:

来自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();
        }
    }
}
验证:在Swing中创建组件时,该组件无效,即其valid属性为false。当一个组件的宽度、高度、位置和材料已经确定时,它就被认为是有效的。这通常是通过直接或间接调用它们的validate方法来实现的。当我们在容器上调用validate时,如果容器无效,它将通过调用其doLayout方法来验证容器,该方法通常会调用LayoutManager。现在,放置在此容器上的每个子级都将递归地进行验证,这样整个树都将被布局并变得有效

revalidate:当您更改会影响其宽度/高度的属性时,将调用revalidate;当您更改会影响其外观的属性时,将调用repaint。 例如,如果您的JFrame包含一个JPanel,那么在某个时间点,您删除了该JPanel并在其位置插入了一个新的JPanel,这取决于新放置的JPanel的内容、JPanel中组件的大小以及容器本身(借助于它使用的布局管理器)的大小都会发生变化。这会将其推到无效状态。因此,为了验证此更改,必须显式调用revalidate


无效:这是我从未使用过的东西,所以我可能无法提供太多关于它的信息。但是上面的场景似乎可以提供一些提示,比如使用invalidate时会发生什么

我相信当您更新多个组件并希望在最终使用重新验证或验证重新计算布局之前将其标记为无效时,invalidate非常有用。@Qix:IMHO,无需调用,因为它是自动调用的。此外,它本身将完成Java文档中所述的任务,它充当调用invalidate和validate的方便方法。所以这不是两者的总和-重新验证并不总是验证的有效替代品。也就是说,对于AWT,这就是revalidate对于Swing的外观:在这种情况下,我想从未尝试过重新绘制管理器将调用validateI。我正在处理一个难看的错误,并用validate替换revalidate,哪个调用doLayout解决了它……我们如何从静态方法调用validate?