invalidate()とvalidate()とrevalidate()の違い

各メソッドの働きについて良く混乱するので、まとめます。もっとも、Swingではinvalidate()とvalidate()を直接呼ぶ局面はほとんどないと思います。

invalidate()

  • 自分自身と、全ての親コンポーネントをinvalidにする。
  • このメソッドはフラグを立てるだけ。

validate()

revalidate()

  • まず、自身のinvalidate()を実行する。
  • 次に、親コンポーネントを順に辿り、isValidateRoot()がtrueを返すコンポーネントを探す。ちなみに、trueを返すのはJRootPaneとJScrollPaneとJTextFieldのみ。
  • 見つかったコンポーネントのvalidate()の呼び出しをリクエストキューに入れる。
  • このメソッドはEDT以外から呼んでも大丈夫。

以下のコンポーネント階層があったとして([o] = valid, [x] = invalid)

  • rootPane [o]
    • scrollPane [o]
      • panel1 [o]
        • label [o]
        • panel2 [o]
          • button [o]

panel2.revalidate()を呼び出すと、その呼び出し直後は以下の状態になる。

  • rootPane [x]
    • scrollPane [x]
      • panel1 [x]
        • label [o]
        • panel2 [x]
          • button [o]

そして、EDTのイベント消化後に再レイアウトが行われて、以下の状態になる。

  • rootPane [x] (invalidフラグが立ったまま)
    • scrollPane [o] (isValidateRoot()がtrueを返すので、ここから再レイアウトされる)
      • panel1 [o] (再レイアウト)
        • label [o]
        • panel2 [o] (再レイアウト)
          • button [o]