ฟังสวิตช์แท็บบนแผงของ JTabbedPane

ฉันได้พัฒนา Swing GUI แบบง่ายๆ เพื่อให้ผู้ใช้สามารถแก้ไขข้อมูลแอปพลิเคชันของฉันได้ UI ค่อนข้างเรียบง่าย:

  • JFrame ที่มี JTabbedPane
  • แต่ละแท็บประกอบด้วยคลาสย่อยหนึ่งของ JPanel ที่มีเครื่องมือในการแก้ไขลักษณะของข้อมูล
  • ข้อมูลนั้นอยู่ในออบเจ็กต์เดียวและการอ้างอิงจะถูกส่งผ่านไปยัง JPanels แต่ละรายการ

แต่มีปัญหา: ฉันต้องซิงค์ JPanels อื่น

ตัวอย่างเช่น ออบเจ็กต์ข้อมูลจะจัดเก็บรายชื่อบุคคลและรายการงาน

  • JPanel หนึ่งอันอนุญาตให้ผู้ใช้แก้ไขบุคคลได้ เขาสามารถสร้างบุคคลใหม่และลบบุคคลที่มีอยู่ได้

  • JPanel ตัวที่สองอนุญาตให้ผู้ใช้มอบหมายบุคคลให้กับงานได้

JPanels ทั้งสองจะเริ่มต้นได้เมื่อเปิดครั้งแรก ส่วนประกอบต่างๆ ถูกสร้างขึ้นและกำหนดเค้าโครงแล้ว ตอนนี้ผู้ใช้สามารถเริ่มทำงานกับ UI ได้แล้ว

  1. เขาเปิดแท็บแรกของ JTabbedPane และสร้างบุคคลแรก
  2. เขาเปิดแท็บที่สอง ส่วนประกอบของแท็บที่สองจะถูกเตรียมใช้งานและแสดงรายการบุคคลหนึ่งคนที่พร้อมใช้งาน เขามอบหมายงาน
  3. เขากลับไปที่แท็บแรกและสร้างบุคคลที่สอง
  4. เขาสลับกลับไปที่แท็บที่สองเพื่อจัดการกับคนใหม่

แต่แท็บที่สองและ JPanel ที่มีอยู่ในนั้นได้ถูกเตรียมใช้งานแล้ว ผู้ใช้จะไม่เห็นบุคคลที่สอง เว้นแต่ JPanel จะได้รับการอัปเดต ฉันได้ใช้วิธีการอัปเดตแบบกำหนดเองในคลาสย่อย JPanel ของฉันสำหรับแท็บ 2 แล้ว แต่ฉันจะเรียกมันว่าอย่างไร

ฉันต้องการเหตุการณ์ Swing ที่เริ่มทำงานบน Component เมื่อมันถูกวาดใหม่


person lhk    schedule 27.06.2013    source แหล่งที่มา
comment
คุณควรมีโมเดลข้อมูล GUI ที่ประกอบด้วยข้อมูลบุคคลและงานทั้งหมด JPanel แต่ละรายการจะอัปเดตและอัปเดตตามเนื้อหาของโมเดลข้อมูลผ่านการดำเนินการของคอนโทรลเลอร์ นี่คือสถาปัตยกรรมโมเดล / มุมมอง / คอนโทรลเลอร์สำหรับการสร้างแอปพลิเคชัน GUI   -  person Gilbert Le Blanc    schedule 27.06.2013
comment
ฉันรู้รูปแบบ MVC สวิงค่อนข้างบังคับให้คุณใช้มัน สิ่งที่ฉันพยายามใช้คือตัวควบคุม ฉันแค่ต้องหาวิธีแจ้งให้ผู้ควบคุมทราบเมื่อข้อมูลได้รับการอัปเดต Victor Seifert ให้คำตอบที่สมบูรณ์แบบ   -  person lhk    schedule 27.06.2013


คำตอบ (1)


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

คุณควรทำให้ข้อมูลในแท็บของคุณเปลี่ยนรูปแบบ Observable (หรือ Subject จาก รูปแบบผู้สังเกตการณ์) จากนั้นแต่ละแท็บจะตอบสนองต่อการเปลี่ยนแปลงข้อมูลแทนการเปลี่ยนแปลงในแท็บอื่นๆ ได้ วิธีนี้จะช่วยลดเวลาในการอัปเดตให้เหลือเฉพาะเมื่อจำเป็นจริงๆ เท่านั้น และจะแยกแท็บออกจากกันด้วย

ข้อมูลอาจสะท้อนการเปลี่ยนแปลงโดยการทำงานของ PropertyChangeEvent's สิ่งเหล่านี้ควรกระตุ้นให้เกิดการดำเนินการของผู้ควบคุมตามที่ Gilber Le Blanc แนะนำในความคิดเห็น

person Viktor Seifert    schedule 27.06.2013
comment
เยี่ยมมาก ตรงกับสิ่งที่ฉันกำลังมองหา - person lhk; 27.06.2013