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

mik*_*era 107 java user-interface swing

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

Java文档从技术角度对这些进行了一些定义,但是它们的使用方式并不是特别清楚.

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

nIc*_*cOw 66

validate():在Swing中创建Component时,它不是valid有效的属性false.当一个组件的宽度,高度,位置和东西已经确定时,该组件被认为是有效的.这通常通过validate()直接或间接调用他们的方法来完成.当我们调用validate()容器时,它将通过调用它的doLayout()方法来验证容器(如果它是无效的),通常会调用它LayoutManager.现在,放置在此容器上的每个子项将以递归方式进行验证,以便整个树将被布局并且将变为有效.

revalidate():revalidate()当您更改会影响其宽度/高度的属性时调用,并在更改会影响其外观的属性时调用repaint().例如,如果你JFrame包含a JPanel,现在在某个时间点你删除它JPanel并在其位置插入一个新的,取决于新放置的内容,JPanel内部组件的大小JPanel以及它The CONTAINER自己(由此它所使用的布局管理器),更改.这会将其推送到无效状态.因此,为了验证此更改,您必须明确调用revalidate().

invalidate():这是我从未使用过的东西,因此可能没有太多关于它的信息.但似乎上面提到的场景可以给出一些暗示,关于使用时会发生什么invalidate().

  • 我相信,当您更新多个组件并希望在最终使用 revalidate() 或 validate() 重新计算布局之前将它们标记为无效时,invalidate() 非常有用。 (2认同)

Sta*_*avL 64

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `revalidate()` 不会调用 `doLayout()`,而 `validate()` 会调用。所以它实际上并不是两者的总和 - `revalidate` 并不总是对 `validate` 的有效替代。 (3认同)