Swing组件有多种与屏幕布局更新相关的方法,特别是:
Java文档从技术角度对这些进行了一些定义,但是它们的使用方式并不是特别清楚。
这些之间有什么区别,在什么情况下你应该使用一个而不是其他一个?
答案 0 :(得分:64)
validate()
:在创建组件时,在Swing中,它不是valid
,即其有效属性为false
。当一个组件的宽度,高度,位置和东西已经确定时,该组件被认为是有效的。这通常通过直接或间接调用他们的validate()
方法来完成。当我们在容器上调用validate()
时,它将通过调用其doLayout()
方法来验证容器(如果它是无效的),该方法通常会调用LayoutManager
。现在,放置在这个容器上的每个子项都将以递归方式进行验证,这样整个树就会被布局并生效。
revalidate()
:当您更改会影响其宽度/高度的属性时调用revalidate()
,并在更改会影响其外观的属性时调用repaint()。
例如,如果您的JFrame
包含JPanel
,那么现在在某个时间点删除JPanel
并在其位置插入一个新的,具体取决于新放置的内容JPanel
,JPanel
内部组件的大小以及The CONTAINER
本身(凭借其使用的布局管理器)都会发生变化。这会将其推送到无效状态。因此,为了验证此更改,您必须明确调用revalidate()
。
invalidate()
:这是我从未使用过的东西,因此我可能没有太多关于它的信息。但似乎上面提到的场景可以给出一些提示,关于使用invalidate()
时会发生什么。
答案 1 :(得分:62)
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();
}
}
}