[英]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.