Swingコンポーネントには、画面レイアウトの更新に関連する次のような複数のメソッドがあります。特に:
Javaのドキュメントでは、これらを技術的な観点からいくらか定義していますが、それらがどのように使用されることが意図されているかは特に明確ではありません。
これらの違いは何ですか?また、どのような状況で他のものではなく1つを使用する必要がありますか?
Swingコンポーネントには、画面レイアウトの更新に関連する次のような複数のメソッドがあります。特に:
Javaのドキュメントでは、これらを技術的な観点からいくらか定義していますが、それらがどのように使用されることが意図されているかは特に明確ではありません。
これらの違いは何ですか?また、どのような状況で他のものではなく1つを使用する必要がありますか?
回答:
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();
}
}
}
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 ()
)。
revalidate()
呼び出すことはありません。doLayout()
これは、validate()
ありません。したがって、これは実際には両方の合計でrevalidate
はなく、常に有効な代替とは限りませんvalidate
。