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?

mikera
sumber

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();
        }
    }
}
StanislavL
sumber
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().

IKHTISAR
sumber
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