ความแตกต่างระหว่าง validate (), revalidate () และ invalidate () ใน Swing GUI


111

ส่วนประกอบสวิงมีหลายวิธีที่เกี่ยวข้องกับการอัปเดตเค้าโครงหน้าจอโดยเฉพาะ:

เอกสาร Java กำหนดสิ่งเหล่านี้จากมุมมองทางเทคนิค แต่ยังไม่ชัดเจนว่าจะใช้อย่างไร

อะไรคือความแตกต่างระหว่างสิ่งเหล่านี้และในกรณีใดที่คุณควรใช้แทนที่จะใช้อย่างอื่น?

คำตอบ:


67

invalidate()ทำเครื่องหมายคอนเทนเนอร์ว่าไม่ถูกต้อง หมายความว่าเนื้อหาไม่ถูกต้องและต้องจัดวางใหม่ แต่เป็นเพียงเครื่องหมาย / ธง เป็นไปได้ว่าต้องรีเฟรชคอนเทนเนอร์ที่ไม่ถูกต้องหลายรายการในภายหลัง

validate()ดำเนินการรีเลย์ หมายความว่ามีการขอเนื้อหาที่ไม่ถูกต้องสำหรับทุกขนาดและขนาดขององค์ประกอบย่อยทั้งหมดจะถูกกำหนดเป็นค่าที่เหมาะสมโดย LayoutManager

revalidate()เป็นเพียงผลรวมของทั้งคู่ ทำเครื่องหมายว่าคอนเทนเนอร์ไม่ถูกต้องและดำเนินการเลย์เอาท์ของคอนเทนเนอร์

อัพเดท:

โค้ดบางส่วนจาก 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()ไม่โทรdoLayout()ซึ่งvalidate()ไม่ ดังนั้นจึงไม่ใช่ผลรวมของทั้งสองอย่าง - revalidateไม่ใช่การแทนที่ที่ถูกต้องเสมอvalidateไป
โอ

สำหรับ AWT นี่คือลักษณะการตรวจสอบใหม่สำหรับ Swing: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
Meo

ในกรณีนี้ฉันเดาว่า (ไม่เคยลอง) RepaintManager จะเรียก validate
StanislavL

ฉันกำลังจัดการกับข้อผิดพลาดที่น่าเกลียดและแทนที่การตรวจสอบความถูกต้องอีกครั้งด้วยการตรวจสอบความถูกต้อง (ซึ่งเรียกว่า doLayout) แก้ไขได้ ...
Meo

เราจะเรียก validate () จาก static method ได้อย่างไร?
Kunal Tyagi

69

validate(): ในสวิงเมื่อคุณสร้างตัวแทนก็ไม่ได้เช่นสถานที่ให้บริการที่ถูกต้องคือvalid falseส่วนประกอบถูกกล่าวว่าถูกต้องเมื่อมีการกำหนดความกว้างความสูงตำแหน่งและสิ่งต่างๆ โดยปกติจะทำโดยเรียกvalidate()วิธีการของพวกเขาไม่ว่าทางตรงหรือทางอ้อม เมื่อเราเรียกvalidate()ใช้ container มันจะตรวจสอบความถูกต้องของคอนเทนเนอร์ (หากไม่ถูกต้อง) โดยเรียกdoLayout()method ซึ่งโดยทั่วไปจะเรียกใช้LayoutManager. ตอนนี้ลูกแต่ละคนที่วางไว้บนภาชนะนี้จะได้รับการตรวจสอบซ้ำเพื่อให้ต้นไม้ทั้งหมดถูกจัดวางและจะใช้ได้

revalidate(): revalidate()จะถูกเรียกเมื่อคุณเปลี่ยนแอตทริบิวต์ที่จะส่งผลต่อความกว้าง / ความสูงและเรียกการทาสีใหม่ () เมื่อคุณเปลี่ยนแอตทริบิวต์ที่จะส่งผลต่อลักษณะที่ปรากฏ ตัวอย่างเช่นถ้าคุณJFrameมี a JPanelตอนนี้เมื่อถึงจุดหนึ่งคุณก็เอาออกJPanelและใส่อันใหม่เข้าที่ขึ้นอยู่กับเนื้อหาของสิ่งที่วางใหม่JPanelขนาดของส่วนประกอบที่อยู่ภายในJPanelและในThe CONTAINERตัวมันเอง (โดยธรรม ของตัวจัดการเค้าโครงที่ใช้), การเปลี่ยนแปลง ซึ่งจะผลักดันให้อยู่ในสถานะที่ไม่ถูกต้อง revalidate()ดังนั้นเพื่อที่จะตรวจสอบการเปลี่ยนแปลงนี้คุณจะต้องชัดเจนโทร

invalidate(): นี่เป็นสิ่งที่ฉันไม่เคยใช้ดังนั้นจึงอาจไม่มีข้อมูลมากนักที่ฉันสามารถให้ได้ invalidate()แต่ดูเหมือนว่าสถานการณ์ที่นำเสนอข้างต้นสามารถให้บิตของคำแนะนำเป็นสิ่งที่เกิดขึ้นเมื่อมีการใช้


1
ผมเชื่อว่าinvalidate()จะเป็นประโยชน์เมื่อคุณอัปเดตหลายองค์ประกอบและต้องการที่จะทำเครื่องหมายว่าไม่ถูกต้องก่อนที่จะคำนวณรูปแบบด้วยหรือrevalidate() validate()
Qix - MONICA ถูกหมอกใน

1
@Qix: IMHO ไม่จำเป็นต้องเรียกinvalidate ()เพราะมันจะถูกเรียกโดยอัตโนมัติ ยิ่งไปกว่านั้นrevalidate ()จะทำงานนั้น (ตามที่ระบุไว้ใน Java Docs จะทำหน้าที่เป็นวิธีการที่สะดวกสำหรับการเรียกทั้งสองinvalidate ()และvalidate ())
nIcE cOw
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.