Saya menyusun aplikasi Swing di mana saya sering ingin mengganti konten JPanel. Untuk melakukan ini, saya menelepon removeAll()
, lalu menambahkan konten baru, lalu menelepon revalidate()
.
Namun saya menemukan bahwa konten lama masih benar-benar terlihat (meskipun dikaburkan oleh konten baru). Jika saya menambahkan panggilan ke repaint()
selain revalidate()
, itu berfungsi seperti yang diharapkan.
Saya yakin pada kesempatan lain saya pernah mengalami bahwa menelepon saja revalidate()
sudah cukup.
Jadi pada dasarnya pertanyaan saya adalah - apakah saya harus memanggil kedua fungsi dan jika tidak, kapan saya harus memanggil masing-masing fungsi?
Jawaban:
Anda perlu menelepon
repaint()
danrevalidate()
. Yang pertama memberitahu Swing bahwa area jendela itu kotor (yang diperlukan untuk menghapus gambar anak-anak yang sudah dihapusremoveAll()
); yang terakhir memberitahu manajer tata letak untuk menghitung ulang tata letak (yang diperlukan saat menambahkan komponen). Ini seharusnya menyebabkan anak - anak dari panel mengecat ulang, tetapi mungkin tidak menyebabkan panel itu sendiri melakukannya (lihat ini untuk daftar pemicu pengecatan ulang).Pada catatan yang lebih umum: daripada menggunakan kembali panel asli, saya akan merekomendasikan membangun panel baru dan menukarnya dengan orang tua.
sumber
Setiap kali Anda melakukan remove () atau removeAll (), Anda harus menelepon
setelah Anda selesai menambahkan () komponen baru.
Memvalidasi panggilan () atau memvalidasi ulang () wajib dilakukan saat Anda menghapus () - lihat javadocs yang relevan.
Pengujian saya sendiri menunjukkan bahwa pengecatan ulang () juga diperlukan. Saya tidak yakin persis mengapa.
sumber
revalidate
dipanggil pada wadah setelah komponen baru ditambahkan atau yang lama dihapus. panggilan ini adalah instruksi untuk memberi tahu pengelola tata letak untuk mengatur ulang berdasarkan daftar komponen baru.revalidate
akan memicu panggilan untuk mengecat ulang apa yang menurut komponen itu 'daerah kotor'. Jelas tidak semua wilayah pada AndaJPanel
dianggap kotor olehRepaintManager
.repaint
digunakan untuk memberitahu komponen untuk mengecat ulang dirinya sendiri. Sering kali Anda perlu menyebutnya untuk membersihkan kondisi seperti milik Anda.sumber
revalidate()
cukup minta tata letak wadah, ketika Anda hanya mengalamirevalidate()
pekerjaan, itu bisa disebabkan oleh pembaruan batas komponen anak memicurepaint()
ketika batas mereka diubah selama tata letak ulang. Dalam kasus yang Anda sebutkan, hanya komponen yang dihapus dan tidak ada batasan komponen yang diubah, kasing ini tidak adarepaint()
yang "tidak sengaja" dipicu.sumber
ya, Anda perlu memanggil pengecatan ulang (); validasi ulang (); ketika Anda memanggil removeAll () maka Anda harus memanggil mengecat () dan memvalidasi ulang ()
sumber