แนวปฏิบัติที่ดีที่สุดของการพัฒนา Java Swing คืออะไร


17

ในขณะที่ทำการค้นคว้าล่วงหน้าสำหรับคำถามนี้ฉันพบว่ามีข้อมูลที่ไม่เป็นระเบียบมากเกี่ยวกับ Java Swing แนวทางปฏิบัติที่ดีที่สุดในอินเทอร์เน็ต ดังนั้นฉันคิดว่าฉันจะให้สแต็คแลกเปลี่ยนยิงที่สร้างหนึ่งรายการใหญ่

แนวปฏิบัติที่ดีที่สุดของการพัฒนา Java Swing คืออะไร คุณพบว่าอะไรที่เหมาะกับคุณและทำไม?


2
ฉันเล่นกับสวิงที่โรงเรียนและมันก็ไม่ใช่ประสบการณ์ที่น่าพอใจ สิ่งทั้งหมดดูเหมือนป่องและซับซ้อนโดยไม่จำเป็น แนวทางปฏิบัติที่ดีที่สุดคือการใช้อย่างอื่น
Robert Harvey

1
@RobertHarvey "การเล่นในโรงเรียน" เป็นหนทางไกลจากการส่งมอบซอฟต์แวร์การผลิต ฉันพบว่า Swing สามารถทำทุกอย่างที่ต้องการได้อย่างสมเหตุสมผลและมีเหตุผล

เอาล่ะด้วยวิธีนี้: ถ้ามันเป็นเรื่องยากในโครงการโรงเรียนเพียงอย่างเดียวมันก็คงจะเป็นเรื่องยากจริงๆ
Robert Harvey

1
@RobertHarvey power มาพร้อมกับราคา ...

อีกสิ่งหนึ่งที่สำคัญมาก ส่วนประกอบการแกว่งเป็นแบบอนุกรมและมีบรรพบุรุษหลายคน ดังนั้นพวกเขาจึงหนักเกินไปที่จะรับมรดกในกรณีส่วนใหญ่ คุณควรพิจารณาเทคนิคการพันห่อโดยเฉพาะอย่างยิ่งเมื่อคุณมีสภาวะที่ไม่สามารถแก้ไขได้ หากคุณสืบทอดจากคอมโพเนนต์เพียงใช้เป็นมุมมอง (ในรูปแบบ MVC หรือรูปแบบที่คล้ายกัน)
DávidHorváth

คำตอบ:


12

ฉันสามารถตอบเฉพาะสิ่งที่ได้ผลสำหรับฉันเท่านั้น นักวิจารณ์คนอื่นได้ชี้ให้เห็นว่า Java GUIs โดยทั่วไปตกลงไปใน 'หุบเขาลึกลับ' ที่มีรูปลักษณ์และความรู้สึกที่ไม่เหมือนเจ้าของภาษาและฉันไม่โต้แย้งเรื่องนี้

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

ใช้เครื่องมือจัดการโครงร่างที่เหมาะสม GridBagLayout นั้นทรงพลังมาก แต่ฉันจะบอกได้ว่ามันไม่สามารถทำความสะอาดได้หากไม่มีความคิดเห็นมากเกินไป เมื่อฉันเรียกใช้เครื่องมือวิเคราะห์รหัสแบบคงที่เช่น Sonar บนแอพ GUI รุ่นเก่าที่ฉันดูแลไว้มันจะชี้ให้เห็นถึงจำนวนเวทมนตร์จำนวนมหาศาลเพื่อให้การจัดวาง GridBags ถูกต้อง ฉันประสบความสำเร็จมากมายกับ GroupLayout ซึ่งหลีกเลี่ยงการระบุการจัดเรียงพิกเซลที่สมบูรณ์แบบ

หากคุณคิดว่าคุณต้องการ JDialog ...คุณอาจไม่ต้องการ กล่องโต้ตอบน่ากลัวในแง่ของประสบการณ์การใช้งาน - แอพพลิเคชั่นนี้ตัดสินใจใช้มันสำหรับทุกเมนูและทุกรูปแบบและเพื่อบังคับใช้กฎที่อยู่ด้านบนเสมอในรูปแบบที่แปลกประหลาด สิ่งนี้กลายเป็นฝันร้ายของการบำรุงรักษาเมื่อเราต้องการแจ้งเตือนบางสิ่งเกี่ยวกับเมนู คิวผิดหวังเมื่อคลิกที่กล่องข้อความที่ไม่สามารถโฟกัสได้และไม่สามารถยกเลิกได้

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

นั่นคือทั้งหมดที่ฉันสามารถแนะนำในประสบการณ์ที่ จำกัด ของฉันเป็นที่ยอมรับ


2
JDialogสมบูรณ์ดี - ตราบใดที่คุณใช้สำหรับการโต้ตอบ
Jonas

1
ฉันยอมรับว่าพวกเขาใช้ได้ถ้าคุณใช้ข้อมูลที่ต้องเห็นอย่างแน่นอนและดำเนินการทันที แต่ข้อมูลส่วนใหญ่ไม่จำเป็นต้องขัดขวางประสบการณ์ของผู้ใช้มากนัก นั่นคือประเด็นที่อยู่เบื้องหลังการคัดเลือกของฉัน
Tom G

@ Jonas ฉันคิดว่าประเด็นคือการสนทนาเป็นสิ่งที่ไม่ดี (ไม่ว่าพวกเขาจะดำเนินการด้วยJDialogหรือไม่)
Tom Hawtin - tackline

1
การมีเพศสัมพันธ์เป็นเพียงเล็กน้อยที่ด้านเหม็น แต่มัน IMO ดีกว่าการเขียนรหัสเกลียวของคุณเอง ฉันควรจะจัดการกับรหัสที่ไม่เหมาะสมกว่าข้อบกพร่องของเธรดที่ละเอียดอ่อน
Tom G

3
คุณอาจต้องการดู MigLayout - miglayout.com

4

ฉันจะบอกว่าหนึ่งในสิ่งแรกคือการไม่ทำงานโดยตรง ระบบเลย์เอาต์ใน Swing (IMHO) นั้นแย่มากและการพยายามทำให้แอพที่เป็นกอบเป็นกำนั้นเป็นฝันร้าย

สองในตัวจัดการเลย์เอาต์ทางเลือกมากมายที่ฉันใช้คือเลย์เอาต์ MigLayout และ MultiSplitPane MigLayout เป็นจุดประสงค์ทั่วไปและทำให้การจัดวางใด ๆ ที่คุณคิดได้ง่ายและมีเหตุผล MultiSplitPane มีความเฉพาะเจาะจงมากขึ้น ฉันใช้มันเพื่อสร้างเลย์เอาต์ที่เรียบง่ายสำหรับ GUI ที่ไม่มีความซับซ้อนมาก

แก้ไข : นี้ไม่ได้แทนการแกว่ง ถ้าคุณต้องใช้การสวิงคุณยังคงสามารถใช้ตัวจัดการเลย์เอาต์เหล่านี้ได้เนื่องจากพวกเขาจัดการการสวิงเท่านั้นอย่าแทนที่


แน่นอนทางเลือกที่ดีกว่าคือไม่ใช้ Swing สวิงถูกวิพากษ์วิจารณ์อย่างหนักเพราะเป็นเรื่องที่น่ากลัวในการทำงานไม่ดูพื้นเมืองและช้า มีหลายทางเลือกที่ได้เรียนรู้จากการแกว่งในสิ่งที่ไม่ควรทำเช่น Qt, SWT และฉันคิดว่าแม้แต่ GTK เหล่านี้เป็นโซลูชั่นระยะยาวที่ยอดเยี่ยมสำหรับการปวดหัวของสวิง

แก้ไข : ดังที่ @ ลอร์ดทอร์กามุสกล่าวว่าสิ่งเหล่านี้จะไม่สามารถใช้งานได้หากคุณบังคับให้ใช้งาน Swing หากคุณจะใช้สิ่งเหล่านี้ให้ดีที่สุดเพื่อสร้างสิ่งนี้เมื่อคุณสร้างโครงการของคุณไม่ใช่ 3/4 ผ่านหรือเมื่อเลือกแอปรุ่นเก่า

ฉันยังต้องการที่จะทราบว่าส่วนใหญ่ของ GUI ทางเลือกส่วนใหญ่จะใช้ไลบรารี่พื้นฐานเพื่อให้ดูเหมือนกับระบบปฏิบัติการจากนั้นกลับไปที่ Swing หรือ Pure Java GUI อื่น ๆ


4
ฉันขอขอบคุณความคิดเห็นของคุณ แต่ "ไม่ใช้ Swing" ไม่เป็นประโยชน์สำหรับผู้ที่จบลงที่คำถามนี้เพราะพวกเขาถูกบังคับให้ใช้ Swing ด้วยเหตุผลใดก็ตาม
Pops

@ ลอร์ดนั่นคือเหตุผลที่ฉันแนะนำผู้จัดการเลย์เอาท์อื่นก่อนที่จะแนะนำ QT และ SWT ใช้เส้นทางไหนก็ได้ที่คุณทำได้
TheLQ

"ระบบเลย์เอาต์ใน Swing (IMHO) นั้นแย่มากและการพยายามทำให้แอพพลิเคชั่นที่มากมายนั้นเป็นฝันร้าย" ผู้จัดการเลย์เอาต์มักมาจาก AWT ไม่ใช่ Swing ที่ได้รับมีบาง Swing เฉพาะเช่น BoxLayout และ GroupLayout ต้องบอกว่าผู้จัดการเลย์เอาต์เป็นตัวเลือกที่สมบูรณ์ ... คุณสามารถระบุพิกัดสำหรับแต่ละองค์ประกอบได้เช่นเดียวกับที่คุณทำใน. NET WinForms (ยกเว้น. NET มี GUI ที่ดีสำหรับคุณ)
Powerlord

3
ดู MigLayout - miglayout.com

1
@TheLQ ตกลงฉันเห็นด้วยกับตัวจัดการไฟล์ของ Swing ว่าอันนั้นโง่จริงๆ (สำหรับ Mac OS X ด้วย) อย่างไรก็ตามฉันแค่ใช้ตัวจัดการไฟล์ของ AWT เพื่อแก้ไข ใช้งานได้ดีแม้ว่าส่วนที่เหลือของแอปพลิเคชันนั้นทำโดยใช้ Swing
stommestack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.