Swing GUI 中有效()、重新有效()和无效()之间的区别

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

Java 文档在某种程度上从技术角度定义了这些内容,但是并不十分清楚如何使用它们。

这两者之间有什么区别? 在什么情况下应该使用其中一种而不是其他的?

65473 次浏览

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

validate()执行中继。这意味着 LayoutManager 要求所有大小的内容都是无效的,并且所有子组件的大小都被设置为适当的值。

revalidate()是两者的总和,它将容器标记为无效并执行容器的布局。

UPDATE:

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

validate(): 在 Swing 中,当你创建一个组件时,它不是 valid,也就是说它的有效属性是 false。当一个组件的宽度、高度、位置和材料已经确定时,这个组件就是有效的。这通常是通过直接或间接调用它们的 validate()方法来完成的。当我们对容器调用 validate()时,它将通过调用它的 doLayout()方法来验证容器(如果无效的话) ,doLayout()方法通常会调用 LayoutManager。现在,将递归地验证放置在这个容器上的每个子元素,以便布局整个树并使其有效。

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

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