Swing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别
Swing 组件具有多种与屏幕布局更新相关的方法,特别是:
Java文档从技术角度对这些进行了一些定义,但并不是特别清楚如何使用它们。
它们之间有什么区别,在什么情况下你应该使用一个而不是其他的?
Swing 组件具有多种与屏幕布局更新相关的方法,特别是:
Java文档从技术角度对这些进行了一些定义,但并不是特别清楚如何使用它们。
它们之间有什么区别,在什么情况下你应该使用一个而不是其他的?
invalidate()
将容器标记为无效。意味着内容在某种程度上是错误的,必须重新布局。但它只是一种标记/旗帜。以后可能必须刷新多个无效容器。
validate()
执行中继输出。这意味着所有大小都要求无效内容,并且布局管理器将所有子组件的大小设置为适当的值。
revalidate()
只是两者的总和。它将容器标记为无效并执行容器的布局。
更新:
组件中的一些代码.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()
LayoutManager
revalidate()
:是当您更改会影响其宽度/高度的属性时调用,并在更改会影响其外观的属性时调用 repaint()。例如,如果您包含一个 ,现在在某个时间点删除了它并在其位置插入了一个新的,则根据新放置的内容,内部组件的大小以及其自身(通过其使用的布局管理器)会发生变化。这会将其推到无效状态。因此,为了验证此更改,您必须显式调用 。revalidate()
JFrame
JPanel
JPanel
JPanel
JPanel
The CONTAINER
revalidate()
invalidate()
:这是我从未使用过的东西,所以我可能没有太多的信息可以提供。但是,似乎上面介绍的场景可以给出一些提示,说明使用 时会发生什么。invalidate()