Perbedaan antara validate (), revalidate () dan invalidate () di Swing GUI


111

Komponen ayunan memiliki beberapa metode yang terkait dengan pembaruan tata letak layar, khususnya:

Dokumentasi Java mendefinisikan ini agak dari perspektif teknis, tetapi tidak terlalu jelas bagaimana mereka dimaksudkan untuk digunakan.

Apa perbedaan di antara keduanya, dan dalam situasi apa Anda sebaiknya menggunakan salah satunya daripada yang lain?

Jawaban:


67

invalidate()menandai wadah sebagai tidak valid. Berarti isinya salah dan harus ditata ulang. Tapi itu hanya semacam tanda / bendera. Ada kemungkinan bahwa beberapa penampung yang tidak valid harus disegarkan nanti.

validate()melakukan relayout. Artinya, konten yang tidak valid diminta untuk semua ukuran dan semua ukuran subkomponen disetel ke nilai yang sesuai oleh LayoutManager.

revalidate()hanyalah jumlah dari keduanya. Ini menandai penampung sebagai tidak valid dan melakukan tata letak penampung.

MEMPERBARUI:

Beberapa kode dari Component.java

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()tidak menelepon doLayout(), yang validate()tidak. Jadi, ini sebenarnya bukan jumlah keduanya - revalidatetidak selalu merupakan pengganti yang valid validate.
Meo

Itu untuk AWT, seperti inilah tampilan validasi
Meo

Dalam hal ini saya kira (tidak pernah mencoba) RepaintManager akan memanggil validasi
StanislavL

Saya berurusan dengan bug jelek dan mengganti validasi ulang dengan validasi (yang menyebut doLayout) menyelesaikannya ...
Meo

Bagaimana kita memanggil validate () dari metode statis?
Kunal Tyagi

69

validate(): Dalam Swing ketika Anda membuat sebuah Komponen, itu bukanlah validproperti yang valid false. Suatu komponen dikatakan valid, bila lebar, tinggi, lokasi dan barangnya telah ditentukan. Ini biasanya dilakukan dengan memanggil validate()metode mereka , secara langsung atau tidak langsung. Ketika kita memanggil validate()kontainer, itu akan memvalidasi kontainer (jika tidak valid) dengan memanggil doLayout()metodenya, yang biasanya akan memanggilLayoutManager . Sekarang setiap anak yang ditempatkan di penampung ini akan divalidasi secara rekursif, sehingga seluruh pohon akan ditata dan menjadi valid.

revalidate(): revalidate()dipanggil saat Anda mengubah atribut yang akan memengaruhi lebar / tinggi dan memanggil ulang () saat Anda mengubah atribut yang akan memengaruhi penampilannya. Misalnya, jika Anda JFrameberisi JPanel, sekarang pada titik waktu tertentu Anda menghapusnya JPaneldan memasukkan yang baru di tempatnya, tergantung pada konten yang baru ditempatkan JPanel, ukuran komponen di dalam JPaneldan juga The CONTAINERitu sendiri (berdasarkan dari manajer tata letak yang digunakan olehnya), perubahan. Yang mendorongnya ke status tidak valid. Jadi untuk memvalidasi perubahan ini, Anda harus memanggil secara eksplisit revalidate().

invalidate(): Ini adalah sesuatu yang belum pernah saya gunakan, jadi mungkin tidak banyak info yang bisa saya berikan tentangnya. Tapi sepertinya skenario yang disajikan di atas dapat memberikan sedikit petunjuk, tentang apa yang terjadi saat menggunakan invalidate().


1
Saya yakin invalidate()ini berguna saat Anda memperbarui beberapa komponen dan ingin menandainya sebagai tidak valid sebelum akhirnya menghitung ulang tata letak dengan revalidate()atau validate().
Qix - MONICA DISALAHKAN

1
@Qix: IMHO, tidak perlu memanggil invalidate () karena dipanggil secara otomatis. Selain itu, revalidate () sendiri akan melakukan tugas itu (Seperti yang dinyatakan dalam Java Docs, ini bertindak sebagai metode yang nyaman untuk memanggil keduanya invalidate ()dan validate ()).
nIcE cOw
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.