Swing GUIでのvalidate()、revalidate()、およびinvalidate()の違い


111

Swingコンポーネントには、画面レイアウトの更新に関連する次のような複数のメソッドがあります。特に:

Javaのドキュメントでは、これらを技術的な観点からいくらか定義していますが、それらがどのように使用されることが意図されているかは特に明確ではありません。

これらの違いは何ですか?また、どのような状況で他のものではなく1つを使用する必要がありますか?

回答:


67

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

3
revalidate()呼び出すことはありません。doLayout()これは、validate()ありません。したがって、これは実際には両方の合計でrevalidateはなく、常に有効な代替とは限りませんvalidate
Meo

つまり、AWTの場合、Swingでのrevalidate
Meo

この場合、私は(決して試したことがない)RepaintManagerがvalidateを呼び出すと思います
StanislavL

私は醜いバグに対処し、revalidateをvalidate(これはdoLayoutを呼び出す)に置き換えて解決しました...
Meo

静的メソッドからvalidate()を呼び出すにはどうすればよいですか?
Kunal Tyagi

69

validate():Swingでコンポーネントを作成すると、コンポーネントはvalid有効になりません。つまり、有効なプロパティはfalseです。コンポーネントは、幅、高さ、場所などが決定されたときに有効であると言います。これは通常validate()、直接または間接的にメソッドを呼び出すことによって行われます。validate()コンテナを呼び出すと、そのdoLayout()メソッドを呼び出すことにより(無効な場合は)コンテナが検証され、通常はが呼び出されLayoutManagerます。これで、このコンテナに配置された各子が再帰的に検証され、ツリー全体がレイアウトされて有効になります。

revalidate()revalidate()幅/高さに影響を与える属性を変更するときに呼び出され、外観に影響を与える属性を変更するときにrepaint()を呼び出します。たとえば、がをJFrame含んでいる場合JPanel、特定の時点でそれを削除しJPanel、その場所に新しいものを挿入しました。新しく配置されたの内容、JPanel内のコンポーネントのサイズ、JPanelおよびThe CONTAINERそれ自体によって(美徳によって)それによって使用されるレイアウトマネージャーの)、変更。これはそれを無効な状態にします。したがって、この変更を検証するには、明示的にを呼び出す必要がありますrevalidate()

invalidate():これは私が使用したことがないものなので、提供できる情報が少ない可能性があります。しかし、上記のシナリオでは、を使用しinvalidate()たときに何が起こるかについて、少しヒントが得られるようです。


1
私は信じてinvalidate()あなたがいくつかのコンポーネントを更新し、無効の前に、最終的にレイアウトを再計算するようにそれらをマークしたいしている場合に便利ですrevalidate()validate()
Qix-モニカは

1
@Qix:IMHO 、それは自動的に呼び出されているため、invalidate()を呼び出す必要はありません。また、()再検証自体はそのタスクを行いますが(Javaのドキュメントに記載されているように、それは両方の呼び出しのための便利な方法として機能invalidate ()してをvalidate ())。
2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.