ส่วนประกอบสวิงมีหลายวิธีที่เกี่ยวข้องกับการอัปเดตเค้าโครงหน้าจอโดยเฉพาะ:
เอกสาร Java กำหนดสิ่งเหล่านี้จากมุมมองทางเทคนิค แต่ยังไม่ชัดเจนว่าจะใช้อย่างไร
อะไรคือความแตกต่างระหว่างสิ่งเหล่านี้และในกรณีใดที่คุณควรใช้แทนที่จะใช้อย่างอื่น?
ส่วนประกอบสวิงมีหลายวิธีที่เกี่ยวข้องกับการอัปเดตเค้าโครงหน้าจอโดยเฉพาะ:
เอกสาร Java กำหนดสิ่งเหล่านี้จากมุมมองทางเทคนิค แต่ยังไม่ชัดเจนว่าจะใช้อย่างไร
อะไรคือความแตกต่างระหว่างสิ่งเหล่านี้และในกรณีใดที่คุณควรใช้แทนที่จะใช้อย่างอื่น?
คำตอบ:
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();
}
}
}
validate(): ในสวิงเมื่อคุณสร้างตัวแทนก็ไม่ได้เช่นสถานที่ให้บริการที่ถูกต้องคือvalid falseส่วนประกอบถูกกล่าวว่าถูกต้องเมื่อมีการกำหนดความกว้างความสูงตำแหน่งและสิ่งต่างๆ โดยปกติจะทำโดยเรียกvalidate()วิธีการของพวกเขาไม่ว่าทางตรงหรือทางอ้อม เมื่อเราเรียกvalidate()ใช้ container มันจะตรวจสอบความถูกต้องของคอนเทนเนอร์ (หากไม่ถูกต้อง) โดยเรียกdoLayout()method ซึ่งโดยทั่วไปจะเรียกใช้LayoutManager. ตอนนี้ลูกแต่ละคนที่วางไว้บนภาชนะนี้จะได้รับการตรวจสอบซ้ำเพื่อให้ต้นไม้ทั้งหมดถูกจัดวางและจะใช้ได้
revalidate(): revalidate()จะถูกเรียกเมื่อคุณเปลี่ยนแอตทริบิวต์ที่จะส่งผลต่อความกว้าง / ความสูงและเรียกการทาสีใหม่ () เมื่อคุณเปลี่ยนแอตทริบิวต์ที่จะส่งผลต่อลักษณะที่ปรากฏ ตัวอย่างเช่นถ้าคุณJFrameมี a JPanelตอนนี้เมื่อถึงจุดหนึ่งคุณก็เอาออกJPanelและใส่อันใหม่เข้าที่ขึ้นอยู่กับเนื้อหาของสิ่งที่วางใหม่JPanelขนาดของส่วนประกอบที่อยู่ภายในJPanelและในThe CONTAINERตัวมันเอง (โดยธรรม ของตัวจัดการเค้าโครงที่ใช้), การเปลี่ยนแปลง ซึ่งจะผลักดันให้อยู่ในสถานะที่ไม่ถูกต้อง revalidate()ดังนั้นเพื่อที่จะตรวจสอบการเปลี่ยนแปลงนี้คุณจะต้องชัดเจนโทร
invalidate(): นี่เป็นสิ่งที่ฉันไม่เคยใช้ดังนั้นจึงอาจไม่มีข้อมูลมากนักที่ฉันสามารถให้ได้ invalidate()แต่ดูเหมือนว่าสถานการณ์ที่นำเสนอข้างต้นสามารถให้บิตของคำแนะนำเป็นสิ่งที่เกิดขึ้นเมื่อมีการใช้
invalidate()จะเป็นประโยชน์เมื่อคุณอัปเดตหลายองค์ประกอบและต้องการที่จะทำเครื่องหมายว่าไม่ถูกต้องก่อนที่จะคำนวณรูปแบบด้วยหรือrevalidate() validate()
invalidate ()และvalidate ())
revalidate()ไม่โทรdoLayout()ซึ่งvalidate()ไม่ ดังนั้นจึงไม่ใช่ผลรวมของทั้งสองอย่าง -revalidateไม่ใช่การแทนที่ที่ถูกต้องเสมอvalidateไป