【发布时间】:2012-03-19 14:07:25
【问题描述】:
Swing 组件有多种与屏幕布局更新相关的方法,特别是:
Java 文档从技术角度对这些进行了一定程度的定义,但并不清楚它们的用途。
这些有什么区别,在什么情况下你应该使用其中一个而不是其他的?
【问题讨论】:
标签: java swing user-interface
Swing 组件有多种与屏幕布局更新相关的方法,特别是:
Java 文档从技术角度对这些进行了一定程度的定义,但并不清楚它们的用途。
这些有什么区别,在什么情况下你应该使用其中一个而不是其他的?
【问题讨论】:
标签: java swing user-interface
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();
}
}
}
【讨论】:
revalidate() 不会调用doLayout(),而validate() 会调用。所以它并不是两者的总和 - revalidate 并不总是有效替代 validate。
validate():在 Swing 中,当你创建一个组件时,它不是valid,即它的有效属性是false。当组件的宽度、高度、位置和内容已确定时,该组件被称为有效。这通常通过直接或间接调用他们的validate() 方法来完成。当我们在容器上调用validate() 时,它将通过调用其doLayout() 方法来验证容器(如果它无效),该方法通常会调用LayoutManager。现在放置在这个容器上的每个子节点都将被递归验证,这样整个树就会被布局并变得有效。
revalidate() : revalidate() 将在您更改会影响其宽度/高度的属性时调用,并在您更改会影响其外观的属性时调用 repaint()。
例如,如果您的JFrame 包含一个JPanel,现在在某个时间点您删除了该JPanel 并在其位置插入了一个新的,具体取决于新放置的JPanel 的内容,大小JPanel 内部的组件以及 The CONTAINER 本身(通过它使用的布局管理器)发生了变化。这会将其推向无效状态。因此,为了验证此更改,您必须显式调用 revalidate()。
invalidate() :这是我从未使用过的东西,所以我可能无法提供太多关于它的信息。但似乎上面介绍的场景可以提供一些提示,即使用invalidate() 时会发生什么。
【讨论】:
invalidate() 在您更新多个组件并希望在最终使用revalidate() 或validate() 重新计算布局之前将它们标记为无效时很有用。
invalidate () 和 validate () 的便捷方法。