1. ホーム

[解決済み】Java Swingのrevalidate()とrepaint()の比較)

2022-04-07 02:40:57

質問

Swingアプリケーションを組んでいて、JPanelの中身をよく入れ替えたいと思うのですが、どうしたらいいでしょうか?これを行うには、私は removeAll() を呼び出し、新しいコンテンツを追加し、次に revalidate() .

しかし、古いコンテンツはまだ実際に表示されています(新しいコンテンツによって見えなくなっていますが)。もし私が repaint() に加えて revalidate() であれば、期待通りに動作します。

を呼び出すだけでは、他の機会にも経験したことがあると思います。 revalidate() は十分です。

つまり、基本的に私の質問は、両方の関数を呼び出す必要があるのか、そうでない場合、それぞれをいつ呼び出すべきなのか、ということです。

どのように解決するのですか?

を呼び出す必要があります。 repaint()revalidate() . 前者は Swing にウィンドウの領域が汚れていることを知らせます (これは removeAll() 後者はレイアウトマネージャにレイアウトの再計算を指示します(コンポーネントを追加するときに必要です)。これによって 子供たち のパネルが再描画されますが、パネル自体は再描画されないかもしれません ( これ は再描画のトリガーの一覧です)。

より一般的な話として、元のパネルを再利用するよりも、新しいパネルを構築して、親で入れ替えることをお勧めします。