簡體   English   中英

Java Swing revalidate()與repaint()

[英]Java Swing revalidate() vs repaint()

我將一個Swing應用程序放在一起,我經常想替換JPanel的內容。 為此,我調用removeAll() ,然后添加新內容,然后調用revalidate()

但是我發現舊內容實際上仍然可見(盡管被新內容遮蓋了)。 如果我除了revalidate()之外還添加了對repaint()的調用,它將按預期工作。

我確信在其他情況下,我經歷過僅調用revalidate()就足夠了。

因此,基本上我的問題是-我需要同時調用這兩個函數嗎?如果不需要,何時應分別調用它們?

您需要調用repaint()revalidate() 前者告訴Swing窗口的區域很臟(這對於擦除由removeAll()刪除的舊孩子的圖像是必需的); 后者告訴布局管理器重新計算布局(添加組件時這是必需的)。 這應該會導致面板重繪的孩子 ,但可能不會導致面板本身這樣做(見對於重繪觸發的列表)。

總的來說,我建議不要建立原始面板,而建議重新構建面板,並在父面板上交換它們。

每當您執行remove()或removeAll()時,都應調用

  validate();
  repaint();

完成add()后,添加新組件。

執行remove()時必須調用validate()或revalidate()-請參閱相關的Javadocs。

我自己的測試表明repaint()也是必需的。 我不確定為什么。

一旦添加了新組件或刪除了舊組件,就會在容器上調用revalidate 該調用是告訴布局管理器根據新組件列表進行重置的指令。 revalidate將觸發調用以重繪組件認為是“臟區”的內容。 顯然, RepaintManager不會將JPanel上的所有區域都視為臟RepaintManager

repaint用於告訴組件重繪自身。 通常情況下,您需要調用此命令來清理諸如您的情況。

revalidate()只是請求對容器進行布局,當您體驗簡單地調用revalidate() ,可能是由於子組件邊界的更新在重新布局期間更改其邊界而觸發repaint()時引起的。 在您提到的情況下,僅刪除了組件並且沒有更改組件邊界,在這種情況下,不會“意外”觸發repaint()

是的,您需要調用repaint();。 revalidate(); 當您調用removeAll()時,您必須調用repaint()和revalidate()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM