5

revalidate / repaint/packをいつ使用するかを理解しようとしています。

驚いたことに、詳細な内部ドキュメントは見つかりませんでした(自由にリンクしてください)。

これまでのところ、これがRepaintManagerのすべての責任であることを理解しました。

  • ペイント/リペイントとは、汚れた/きれいなものと見なされるものを指します
  • pack / validate / revalidateは、有効なものを参照します

Oracleに関するこの記事では、再ペイントを呼び出すと、イベントディスパッチャスレッドにジョブがエンキューされ、コンポーネントでpaintImmediately()が呼び出される(これによりコンポーネントが再描画される)と説明しています。

この証跡は、有効であるか無効であるかがLayoutManagerに関連付けられていることを示しています。そして、これはすべて、コンテンツではなく、コンポーネントのサイズに関するものです。

  1. コンポーネントを移動/サイズ変更するときに再検証を呼び出し、コンポーネントの内容を変更するときに再ペイントする必要があるというのは本当ですか?
  2. pack()メソッドは本当に非推奨であり、決して呼び出さないでください。
  3. 上記の主張のいずれかが間違っていますか?
4

1 に答える 1

6

これらのメソッドを呼び出す必要があるいくつかの基本的なケースを次に示します (基本的なことは説明しますが、これらのメソッドの呼び出しが必要になる他のいくつかのケースを見逃している可能性があります)。

  1. revalidate()1 つまたは複数のコンポーネントを追加した場合、1 つまたは複数のコンポーネントを削除した場合、1 つまたは複数の含まれているコンポーネントの制約を変更した場合 (制約または XXXSize()、ただし後者は推奨されません) LayoutManager、コンテナ。
  2. repaint()そのコンポーネント (およびその子孫) を再描画したいときはいつでも呼び出す必要があります。最終的に、これはpaintComponent()(基本的なウィジェットの場合、これは XXXUI.paint() に委任されます) を呼び出しpaintBorder()paintChildren()(少なくとも Swing では)
  3. pack()実際には、ウィンドウのサイズを適切なサイズに設定します。通常、ウィンドウを表示する直前にこれを呼び出す必要があります。後で呼び出すこともできますが、これは奇妙なユーザー エクスペリエンスを提供します (一度表示されたウィンドウのサイズを変更する多くのアプリケーションを知りません)。

andを使用する主な利点は、revalidate()andrepaint()を結合できることです。これは、 を複数回呼び出すとrepaint()、ペイントは 1 回だけ実行されることを意味します。

于 2013-01-15T16:05:32.700 に答える