Swing GUI'de validate (), revalidate () vevalidate () arasındaki fark


111

Salınım bileşenlerinin ekran düzeni güncellemeleriyle ilgili birden çok yöntemi vardır, özellikle:

Java dokümantasyonu bunları bir şekilde teknik bir bakış açısıyla tanımlar, ancak bunların nasıl kullanılması gerektiği özellikle açık değildir.

Bunlar arasındaki fark nedir ve hangi durumlarda diğerlerinden ziyade birini kullanmalısınız?

Yanıtlar:


67

invalidate()kapsayıcıyı geçersiz olarak işaretler. İçeriğin bir şekilde yanlış olduğu ve yeniden düzenlenmesi gerektiği anlamına gelir. Ama bu sadece bir tür işaret / bayrak. Birden fazla geçersiz kapsayıcı daha sonra yenilenmek zorunda kalabilir.

validate()aktarma gerçekleştirir. Bu, tüm boyutlar için geçersiz içerik istendiği ve tüm alt bileşenlerin boyutlarının LayoutManager tarafından uygun değerlere ayarlandığı anlamına gelir.

revalidate()sadece ikisinin toplamıdır. Konteyneri geçersiz olarak işaretler ve konteynerin düzenini gerçekleştirir.

GÜNCELLEME:

Component.java'dan bazı kodlar

public void revalidate() {
    revalidateSynchronously();
}

/**
 * Revalidates the component synchronously.
 */
final void revalidateSynchronously() {
    synchronized (getTreeLock()) {
        invalidate();

        Container root = getContainer();
        if (root == null) {
            // There's no parents. Just validate itself.
            validate();
        } else {
            while (!root.isValidateRoot()) {
                if (root.getContainer() == null) {
                    // If there's no validate roots, we'll validate the
                    // topmost container
                    break;
                }

                root = root.getContainer();
            }

            root.validate();
        }
    }
}

3
revalidate()aramıyor doLayout(), ki validate()bu. Yani aslında her ikisinin toplamı revalidatedeğildir - her zaman için geçerli bir ikame değildir validate.
Meo

Bu AWT için, Swing için yeniden doğrulama böyle görünüyor: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
Meo

Bu durumda, RepaintManager'ın validate çağrısı yapacağını tahmin ediyorum
StanislavL

Çirkin bir hatayla uğraşıyordum ve revalidate'i validate ile değiştiriyordum (doLayout'u çağırıyor) çözdü ...
Meo

Statik bir yöntemden validate () 'i nasıl çağırabiliriz?
Kunal Tyagi

69

validate(): Swing'de bir Bileşen oluşturduğunuzda, bu, validyani geçerli özelliği değildir false. Bir bileşenin genişliği, yüksekliği, konumu ve malzemeleri belirlendiğinde geçerli olduğu söylenir. Bu genellikle validate()doğrudan veya dolaylı olarak yöntemlerini çağırarak yapılır . validate()Kapsayıcıları çağırdığımızda , kapsayıcıyı (geçersizse) doLayout()yöntemini çağırarak doğrular ve bu genellikle LayoutManager. Şimdi bu konteynere yerleştirilen her çocuk, tüm ağacın yerleştirilmesi ve geçerli olması için yinelemeli olarak doğrulanacaktır.

revalidate(): revalidate()genişlik / yüksekliğini etkileyecek bir özniteliği değiştirdiğinizde ve görünümlerini etkileyecek bir özniteliği değiştirdiğinizde yeniden boyamayı () çağırdığınızda çağrılır. Örneğin, JFramebir JPanel, şimdi belirli bir noktada JPanel, yeni yerleştirilen içeriğe bağlı olarak, içindeki JPanelbileşenlerin boyutuna ve kendisinin JPanelde boyutuna bağlı olarak onu kaldırıp yerine yeni bir tane yerleştirdiyseniz The CONTAINER(erdemle) tarafından kullanılan düzen yöneticisinin), değişiklikler. Bu da onu geçersiz duruma itiyor. Dolayısıyla bu değişikliği doğrulamak için açıkça aramanız gerekir revalidate().

invalidate(): Bu hiç kullanmadığım bir şey, bu yüzden bu konuda verebileceğim çok fazla bilgi olmayabilir. Ancak, yukarıda sunulan senaryolar, kullanırken ne olacağı konusunda biraz ipucu verebilir gibi görünüyor invalidate().


1
invalidate()Birkaç bileşeni güncellediğinizde ve düzeni nihayet revalidate()veya ile yeniden hesaplamadan önce bunları geçersiz olarak işaretlemek istediğinizde yararlı olduğuna inanıyorum validate().
Qix - MONICA

1
@Qix: IMHO, otomatik olarak çağrıldığı için geçersizate () ' yi çağırmaya gerek yoktur . Dahası, () revalidate kendisi bu görevi yapacak (Java Dokümanlar belirtildiği üzere, her iki arama için uygun bir yöntem olarak görür invalidate ()ve validate ()).
NIcE cOw
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.