การใช้ MVC ในแอป Java


10

ฉันต้องเขียนแอปพลิเคชัน GUI ข้ามแพลตฟอร์มเพื่อประมวลผล (ในหลายเธรด) และเห็นภาพข้อมูลจำนวนมากพอสมควร แอปพลิเคชั่นควรจะค่อนข้างเร็วและดูดี

อินเทอร์เฟซของแอพจะประกอบด้วยวิดเจ็ตตารางวิดเจ็ตต้นไม้และวิดเจ็ตรูปวาดเอง ผู้ใช้จะสามารถแก้ไขข้อมูลจากหนึ่งในวิดเจ็ตเหล่านี้และการเปลี่ยนแปลงควรจะปรากฏในวิดเจ็ตอื่นทันที

โดยธรรมชาติฉันกำลังวางแผนที่จะใช้ MVC อย่างไรก็ตามปกติแล้วฉันจะเขียนโปรแกรม GUI ทั้งหมดใน C ++ / Qt และมีการเปิดรับจาวา จำกัด ดังนั้นฉันจะขอขอบคุณคำแนะนำใด ๆ เกี่ยวกับวิธีการจัดระเบียบแอปใน Java โดยเฉพาะฉันควรใช้ Swing หรือ JavaFX หรือไม่ วิดเจ็ตใดที่คุณจะเลือกสำหรับงาน คุณช่วยแนะนำหนังสือ / บทช่วยสอนออนไลน์ที่ครอบคลุมประเด็นเหล่านี้ของแพลตฟอร์ม Java ได้หรือไม่?

ฉันจะขอขอบคุณสำหรับข้อเสนอแนะใด ๆ ขอบคุณ!

(คำถามนี้ถูกโพสต์ครั้งแรกใน Stack Overflowแต่เว็บไซต์นี้ได้รับการแนะนำว่าเป็นสถานที่ที่เหมาะสมกว่าในการถาม)

คำตอบ:


21

ทั้งหมดนี้เป็นอัตวิสัยมากเพราะเทคโนโลยีที่แตกต่างหลากหลายจะสามารถตอบสนองความต้องการของคุณ

เหมือนคนอื่น ๆ ผมอาจจะเพียงแค่แนะนำเทคโนโลยีผมเองต้องการสำหรับโครงการดังกล่าวซึ่งจะJavaFX

เหตุผลที่ฉันอยากจะแนะนำ JavaFX คือ:

ตกลงฉันเดาว่าข้างต้นเป็นบิตของสัมผัสกัน แต่ฉันต้องการส่งเสริม JavaFX ;-)

อย่างไรก็ตามเพื่อระบุประเด็นเฉพาะในคำถามของคุณ:

  • JavaFX เป็นเฟรมเวิร์ก GUI ข้ามแพลตฟอร์ม (ปัจจุบันคือ Mac / Windows / Linux)
  • JavaFX มีการสนับสนุนเธรดหลายเธรดที่มีคุณภาพสูง (เฟรมเวิร์กหลักคือเธรดเดียวเหมือนกับที่เกี่ยวกับแพลตฟอร์ม GUI อื่น ๆ ที่นั่น แต่คุณสามารถกำหนดภารกิจของคุณเองที่จะดำเนินการพร้อมกันกับเธรด GUI เพื่อให้เธรด GUI ยังคงอยู่ ตอบสนอง)
  • โปรแกรม JavaFX ที่ถูกเขียนมาอย่างดีไม่น่าจะมีปัญหาในการแสดงข้อมูลจำนวนมากพอสมควร นี่คือตัวอย่างโครงการ JavaFXที่ทำเช่นนั้น
  • ความสามารถในการกำหนดรูปแบบแอปพลิเคชันผ่าน css ใช้ประโยชน์จากเอฟเฟกต์ภาพเคลื่อนไหวและภาพเคลื่อนไหวอนุญาตให้คุณทำงานกับนักออกแบบเพื่อทำให้แอปของคุณดูดีหรือทำด้วยตัวเองหากคุณมีทักษะ
  • JavaFX มีTableViewและTreeView ที่คุณสามารถใช้ได้ นอกจากนี้ยังมีการควบคุมTreeTable แบบรวมซึ่งได้รับการพัฒนาเพื่อเตรียมการสำหรับการเปิดตัวJava 8
  • วิดเจ็ตการวาดรูปที่กำหนดเองสามารถใช้รูปร่างกราฟฉากหรือผ้าใบวาดโดยตรงซึ่งเป็นเรื่องของสไตล์การเขียนโค้ดและความชอบ
  • คุณสมบัติและสิ่งอำนวยความสะดวกที่มีผลผูกพันของ JavaFX ประกอบกับเฟรมเวิร์กตัวรับฟังเหตุการณ์ทำให้แก้ไขข้อมูลได้ง่ายโดยใช้การควบคุมเดียว
  • สำหรับการพัฒนารูปแบบ MVC คุณสามารถเขียนโมเดลของคุณโดยใช้วัตถุ java ธรรมดากำหนดมุมมองของคุณโดยใช้ภาษามาร์กอัป FXML (สร้างขึ้นโดยใช้เครื่องมือเลย์เอาต์แบบกราฟิกของ SceneBuilder หากต้องการ) และกำหนดตรรกะการควบคุมของคุณใน Java (หรือภาษาสคริปต์อื่น ๆ รวมทั้งคุณควรแยกสไตล์ของคุณออกจากตรรกะของคุณโดยใช้ CSS
  • เมื่อคุณมีการสัมผัสกับจาวา จำกัด การเรียนรู้จะมีความสำคัญ มีบทช่วยสอน Java ที่ยอดเยี่ยมนอกเหนือจากบทแนะนำ JavaFX ที่ฉันเชื่อมโยงไปก่อนหน้านี้ซึ่งสามารถช่วยได้ รหัสแกน JavaFX ใช้สิ่งอำนวยความสะดวกที่มีอยู่ใน JDK เท่านั้นดังนั้นเมื่อต้องการใช้ JavaFX คุณไม่จำเป็นต้องเรียนรู้เพิ่มเติมในไลบรารีและกรอบเพิ่มเติม (เช่นถ้าคุณกำลังเรียนรู้ JavaEE เป็นต้น) ดังนั้นทั้งสองเว็บไซต์ tuotorial ให้ข้อมูลส่วนใหญ่ที่คุณต้องการได้ถึงความเร็ว
  • สำหรับองค์กรของแอปพลิเคถ้าคุณมีโปรแกรมที่มีความซับซ้อนและต้องการการสนับสนุนของสมบูรณ์กรอบใบสมัครของลูกค้าที่พิสูจน์แล้วและไม่คิดทำมากของการเรียนรู้พิเศษแล้วคุณสามารถฝัง JavaFX ในEclipse RCPหรือNetBeans RCPซึ่งเป็นไปตาม ในหน้าเว็บของพวกเขาอาจช่วยให้คุณประหยัดเวลาในการพัฒนานานหลายปี ฉันขอแนะนำให้ดูที่แพลตฟอร์มดังกล่าวหากความต้องการของคุณเป็นธรรมเพราะสำหรับโครงการขนาดเล็กถึงขนาดกลางมันอาจจะง่ายกว่าที่จะเขียนโค้ดสิ่งต่างๆโดยตรงใน JavaFX โดยไม่ต้องใช้แพลตฟอร์มไคลเอนต์ที่ซับซ้อนเช่น Eclipse และ NetBeans
  • เกี่ยวกับว่าคุณควรใช้ Swing หรือ JavaFX ฉันไม่ใช่คนที่มีวัตถุประสงค์มากที่สุดที่จะตอบคำถามนั้น JavaFX มีข้อบกพร่องที่แน่นอนสำหรับคุณเมื่อคุณเริ่มใช้ (เช่นเดียวกับ Swing)
  • สำหรับบทเรียนออนไลน์ฉันได้เชื่อมโยงกับบทเรียนที่เกี่ยวข้องมากที่สุดแล้ว มีเป็นชุดที่ดีกวดวิชาสำหรับ app
  • หนังสือPro JavaFX 2และJavaFX 2.0 แนะนำโดยตัวอย่างได้รับการจัดอันดับสูง

ขอบคุณสำหรับคำตอบที่น่าทึ่งนี้! JavaFX แน่ใจว่าดูเหมือนเป็นแพลตฟอร์มที่ดีและแน่นอนฉันจะลงทุนเวลามากกับมัน นอกจากนี้ยังมีหนังสือทั้งสองเล่มที่คุณแนะนำไว้ที่ห้องสมุดของฉัน :)
egor

1
ลิงก์ "IDE ที่ดีที่สุดในโลก" นั้นควรชี้ไปที่ IntelliJ IDEA;) คำตอบที่ยอดเยี่ยมให้ข้อมูลมากขอบคุณ!
Cooper

1
ควรสังเกตว่า JavaFX ในปัจจุบันไม่มีการสนับสนุนการเข้าถึงใด ๆ นั่นอาจเป็นตัวแบ่งข้อตกลงสำหรับบางคน (สำหรับฉัน) และจะต้องใช้ Swing ต่อไป
Cooper

JavaFX ตอนนี้ให้การสนับสนุนการเข้าถึง ฟังก์ชั่นนี้ได้รับการส่งมอบใน Java 8u40 ซึ่งJEP 204: JavaFX เข้าถึงได้ดำเนินการ
jewelsea

5

ไปด้วยรูปแบบ Model-view-presenterแทน คุณสามารถดูตัวอย่าง MVP ที่ดีใน Swing ได้ที่นี่ผ่านโครงการmvp4j

ในขณะที่ไม่ใช่ Swing ฉันจะตรวจสอบบทความ MVP ที่เว็บไซต์GWT Google Developersเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบนี้และวิธีการใช้ใน Java ผู้ออกแบบหลักเดียวกันยืนโดยไม่คำนึงถึงกรอบและ GWT คล้ายกับสวิง

รายละเอียดอย่างย่อของวิธีการทำงานของ MVP:

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

เมื่อดำเนินการอย่างถูกต้อง MVP จะทำให้แอปพลิเคชันของคุณแยกออกจากกันและอนุญาตให้คุณทำการแก้ไขโดยไม่รบกวนส่วนอื่น ๆ ของแอปพลิเคชันของคุณ

แก้ไข: ตามการตัดสินใจของคุณในการใช้ JavaFX ฉันขอแนะนำให้ตรวจสอบบทความต่อไปนี้


ขอบคุณ! ฉันคิดว่าฉันตัดสินใจไปกับ JavaFX แล้ว แต่จะอ่านเกี่ยวกับ MVP และวิธีการใช้กับแพลตฟอร์มนี้
egor

1
ที่ดี! หากคุณตัดสินใจที่จะใช้รูปแบบ MVP นี่คือลิงค์ที่ให้ตัวอย่างใน JavaFX code.google.com/p/pennychecker-presenter/wiki/JavaFxMvpExample
Cooper

2

วิดเจ็ตที่คุณต้องการสามารถพบได้ทั้งในSwingหรือSWT เอกสารประกอบมีตัวอย่างของส่วนประกอบ (Swing) หรือวิดเจ็ต (SWT) ดังนั้นมันจะค่อนข้างง่ายในการระบุพวกเขา

Swing เป็นไลบรารี GUI ที่รวมอยู่ใน JDK และสร้างขึ้นจากศูนย์ SWT เป็นอุปกรณ์ต่อพ่วงภายนอกและส่วนประกอบต่าง ๆ นั้นยึดตามอุปกรณ์ดั้งเดิม

สำหรับ MVC พวกเขาทั้งสองได้รับการสนับสนุน ใน Swing คุณมี Model สำหรับแต่ละองค์ประกอบที่ให้ข้อมูลพื้นฐาน คอมโพเนนต์เองนั้นเป็นทั้งมุมมองและตัวควบคุม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.