ส่วนประกอบสวิงมีหลายวิธีที่เกี่ยวข้องกับการอัปเดตเค้าโครงหน้าจอโดยเฉพาะ:
เอกสาร 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
ไป