web-dev-qa-db-ja.com

Swing GUIのvalidate()、revalidate()、invalidate()の違い

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

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

これらの違いは何ですか?また、どのような状況で他のものよりもどちらを使用すべきですか?

105
mikera

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

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

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

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

65
nIcE cOw