2012-03-01 8 views
96

Swingコンポーネントは、特に、画面レイアウトの更新に関連する複数の方法があります検証との差()、再検証()及び(無効化)SwingのGUIで

Javaのマニュアルでは、これらは技術的な観点から多少定義されていますが、その使用方法は特に明記されていません。

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

答えて

58

invalidate()は、コンテナを無効とマークします。コンテンツが何とか間違っていることを意味し、再レイアウトする必要があります。しかし、それはちょうどマーク/フラグの一種です。後で複数の無効なコンテナをリフレッシュする必要があります。

validate()は再レイアウトを実行します。これは、すべてのサイズに対して無効なコンテンツが要求され、すべてのサブコンポーネントのサイズがLayoutManagerによって適切な値に設定されていることを意味します。

revalidate()は、両方の合計です。コンテナを無効とマークし、コンテナのレイアウトを実行します。

61

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

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

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

+1

いくつかのコンポーネントを更新していて、それらを無効にする前に、 'revalidate()'や 'validate()'を使ってレイアウトを再計算するときに 'invalidate()'が便利だと思います。 – Qix

+0

@Qix:IMHO、[invalidate()](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#invalidate--)を呼び出す必要はありません。自動的に呼び出されます。さらに、[revalidate()](http://docs.oracle.com/javase/8/docs/api/java/awt/Component。html#revalidate--)自身がそのタスクを実行します(Java Docsに記載されているように、 'invalidate()'と 'validate()'の両方を呼び出す便利なメソッドとして機能します)。 –

関連する問題