Java Swing revalidate () ve repaint () karşılaştırması


211

Sık sık bir JPanel içeriğini değiştirmek istediğim bir Swing uygulamasını bir araya getiriyorum. Bunu yapmak için arıyorum removeAll(), sonra yeni içeriğimi ekledikten sonra arıyorum revalidate().

Ancak eski içeriğin hala görünür olduğunu görüyorum (yeni içerik tarafından gizlenmiş olsa da). repaint()Ayrıca bir çağrı eklerseniz revalidate(), beklendiği gibi çalışır.

Eminim diğer durumlarda sadece aramanın revalidate()yeterli olduğunu deneyimledim .

Temel olarak sorum şu: Her iki işlevi de aramam gerekiyor mu, değilse, her birini ne zaman aramalıyım?


6
Oracle'ın bu öğreticisinde : "Yeniden doğruladıktan sonra her zaman yeniden boyamayı çağırın". Ancak hiçbir açıklama yapılmaz.
dakika

Yanıtlar:


154

Araman gerek repaint()ve revalidate(). İlk Swing'e pencerenin bir alanının kirli olduğunu söyler (bu, kaldırılan yaşlı çocukların imajını silmek için gereklidir removeAll()); ikincisi mizanpaj yöneticisine mizanpajı yeniden hesaplamasını söyler (bileşen eklenirken gereklidir). Bu neden olmalıdır çocukları Rötuş panelin ancak paneli kendisi bunu (bkz neden olmayabilir bu rötuş tetikleyiciler listesi için).

Daha genel bir notta: orijinal paneli yeniden kullanmak yerine, yeni bir panel oluşturmayı ve bunları ebeveynle değiştirmenizi tavsiye ederim.


1
Yeni bir panel oluşturmanın neden eskisini kullanmaktan daha iyi bir çözüm olduğunu rasyonelleştirebilir misiniz? :)
Arttu

3
@Arttu - daha az çalışma ve bu nedenle hatalara daha az eğilimli.
kdgregory

86

Bir remove () veya removeAll () öğesini her yaptığınızda,

  validate();
  repaint();

tamamladıktan sonra yeni bileşenleri ekleyiniz ().

Bir remove () yaptığınızda validate () veya revalidate () öğesini çağırmak zorunludur - ilgili javadok'lara bakın.

Kendi testlerim repaint () işlevinin de gerekli olduğunu gösteriyor. Tam olarak neden olduğundan emin değilim.


59

revalidateyeni bileşenler eklendikten veya eski bileşenler çıkarıldıktan sonra bir kapta çağrılır. bu çağrı, mizanpaj yöneticisine yeni bileşen listesine göre sıfırlamasını söyleme talimatıdır. revalidatebileşenin 'kirli bölgeler' olduğunu düşündüklerini yeniden boyamak için bir çağrıyı tetikler. Açıkçası sizin üzerindeki tüm bölgeler JPaneltarafından kirli sayılmaz RepaintManager.

repaintbir bileşene kendini yeniden boyamasını söylemek için kullanılır. Sizinki gibi koşulları temizlemek için bunu sık sık aramanız gerekir.


5

revalidate()sadece konteyner düzenleme isteği, basitçe çağrı revalidate()işleri deneyimli zaman , alt bileşenlerin sınırlarının repaint()yeniden düzenlenmesi sırasında sınırları değiştirildiğinde tetikleyicilerin güncellenmesi neden olabilir . Bahsettiğiniz durumda, yalnızca bileşen kaldırıldı ve hiçbir bileşen repaint()sınırı değiştirilmedi, bu durumda "yanlışlıkla" tetiklenir.


-4

evet repaint () işlevini çağırmanız gerekir; ) (Yeniden doğrulama; removeAll () öğesini çağırdığınızda repaint () öğesini ve revalidate () yöntemini çağırmanız gerekir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.