ฉันกำลังพัฒนาแอพพลิเคชั่นที่แสดงภาพและเล่นเสียงจากฐานข้อมูล ฉันกำลังพยายามตัดสินใจว่าจะใช้ JFrame แยกต่างหากเพื่อเพิ่มรูปภาพในฐานข้อมูลจาก GUI หรือไม่
ฉันแค่สงสัยว่ามันเป็นวิธีปฏิบัติที่ดีในการใช้หลายหน้าต่าง JFrame หรือไม่?
ฉันกำลังพัฒนาแอพพลิเคชั่นที่แสดงภาพและเล่นเสียงจากฐานข้อมูล ฉันกำลังพยายามตัดสินใจว่าจะใช้ JFrame แยกต่างหากเพื่อเพิ่มรูปภาพในฐานข้อมูลจาก GUI หรือไม่
ฉันแค่สงสัยว่ามันเป็นวิธีปฏิบัติที่ดีในการใช้หลายหน้าต่าง JFrame หรือไม่?
คำตอบ:
ฉันแค่สงสัยว่ามันเป็นวิธีปฏิบัติที่ดีในการใช้ JFrames หลายรายการหรือไม่
การปฏิบัติที่ไม่ดี (เลวร้าย)
มีหลายวิธีในการแสดงองค์ประกอบหลายอย่างใน GUI เดียวเช่น:
CardLayout
( ตัวอย่างสั้น ๆ) ที่ดีสำหรับ:
JInternalFrame
/JDesktopPane
โดยปกติจะใช้สำหรับMDIJTabbedPane
สำหรับกลุ่มของส่วนประกอบJSplitPane
วิธีในการแสดงสององค์ประกอบที่ความสำคัญระหว่างหนึ่งหรืออื่น ๆ (ขนาด) แตกต่างกันไปตามสิ่งที่ผู้ใช้กำลังทำJLayeredPane
ไกลมากดี .. ส่วนประกอบเลเยอร์JToolBar
โดยทั่วไปจะมีกลุ่มของการกระทำหรือการควบคุม สามารถลากไปรอบ ๆ GUI หรือปิดทั้งหมดตามความต้องการของผู้ใช้ ดังกล่าวข้างต้นจะลด / เรียกคืนตามผู้ปกครองทำเช่นนั้นJList
(ตัวอย่างง่ายๆด้านล่าง)JTree
ในฐานะที่เป็นโหนดในแต่ถ้ากลยุทธ์เหล่านั้นใช้ไม่ได้กับกรณีการใช้งานเฉพาะลองทำดังต่อไปนี้ สร้างหลักเดียวJFrame
จากนั้นมีJDialog
หรือJOptionPane
อินสแตนซ์ปรากฏขึ้นสำหรับองค์ประกอบที่เหลือลอยตัวโดยใช้เฟรมเป็นพาเรนต์สำหรับไดอะล็อก
ในกรณีนี้ที่องค์ประกอบหลาย ๆ อย่างเป็นรูปภาพควรใช้วิธีใดวิธีหนึ่งต่อไปนี้แทน:
JLabel
(กึ่งกลางในบานหน้าต่างเลื่อน) เพื่อแสดงรูปใดที่ผู้ใช้สนใจในขณะนั้น เท่าที่เห็นImageViewer
ค่ะJList
แถวเดียว เท่าที่เห็นในคำตอบนี้ ส่วน 'แถวเดี่ยว' ของส่วนนั้นจะใช้งานได้หากมันมีขนาดเท่ากันทั้งหมด อีกทางเลือกหนึ่งถ้าคุณพร้อมที่จะปรับขนาดของภาพในทันทีและอัตราส่วนทั้งหมดเดียวกัน (เช่น 4: 3 หรือ 16: 9)JFrame
s ก่อนและไม่เคยพิจารณาปัญหาเหล่านั้นขอบคุณสำหรับการอธิบาย!
JFrame
วิธีการหลายอย่างเป็นสิ่งที่ฉันนำไปใช้ตั้งแต่เริ่มเขียนโปรแกรมแอพ Swing ส่วนใหญ่ฉันทำตั้งแต่แรกเพราะไม่รู้อะไรเลย อย่างไรก็ตามเมื่อฉันครบกำหนดในประสบการณ์และความรู้ของฉันในฐานะนักพัฒนาและเมื่อเริ่มอ่านและรับฟังความคิดเห็นของ Java devs ที่มีประสบการณ์มากขึ้นทางออนไลน์ฉันพยายามเปลี่ยนจากหลายJFrame
แนวทาง (ทั้งในโครงการปัจจุบันและโครงการในอนาคต ) เท่านั้นที่จะได้พบกับ ... รับสิ่งนี้ ... ความต้านทานจากลูกค้าของฉัน! เมื่อฉันเริ่มใช้กล่องโต้ตอบโมดอลเพื่อควบคุมหน้าต่างและลูก "ย่อย" JInternalFrame
สำหรับส่วนประกอบแยกกันลูกค้าของฉันเริ่มบ่น!ฉันค่อนข้างประหลาดใจเมื่อฉันทำสิ่งที่ฉันคิดว่าเป็นการปฏิบัติที่ดีที่สุด! แต่อย่างที่พวกเขาพูดว่า "ภรรยาที่มีความสุขคือชีวิตที่มีความสุข" กันไปสำหรับลูกค้าของคุณ แน่นอนฉันเป็นผู้รับเหมาดังนั้นผู้ใช้ของฉันสามารถเข้าถึงฉันโดยตรงผู้พัฒนาซึ่งเห็นได้ชัดว่าไม่ใช่สถานการณ์ทั่วไป
ดังนั้นฉันจะอธิบายถึงประโยชน์ของJFrame
วิธีการที่หลากหลายรวมถึงตำนานที่เล่าขานถึงข้อเสียที่คนอื่นนำเสนอ
JFrame
ผู้ใช้ปลายทางของคุณเพื่อกระจายและควบคุมสิ่งที่อยู่บนหน้าจอของเขา / เธอ แนวคิดดังกล่าวให้ความรู้สึก "เปิดกว้าง" และไม่มีการ จำกัด คุณจะสูญเสียนี้เมื่อคุณไปสู่ขนาดใหญ่JFrame
และพวงของJInternalFrame
sJFrame
เอส อย่างไรก็ตามฉันต้องการให้หน้าจอป้อนข้อมูลเป็นJDialog
ผู้ปกครองซึ่งเป็นผู้ดูข้อมูล ฉันทำการเปลี่ยนแปลงและทันทีที่ฉันได้รับโทรศัพท์จากผู้ใช้ปลายทางซึ่งพึ่งพาอย่างมากกับความจริงที่ว่าเขาสามารถย่อหรือปิดโปรแกรมดูและเปิดโปรแกรมแก้ไขในขณะที่เขาอ้างอิงส่วนอื่นของโปรแกรม (หรือเว็บไซต์ฉันไม่ได้ จำไม่ได้) เขาไม่ได้อยู่บนจอภาพหลายจอดังนั้นเขาต้องการไดอะล็อกการเข้าร่วมเป็นอันดับแรกและอย่างอื่นเป็นอันดับสองโดยซ่อนตัวดูข้อมูลไว้อย่างสมบูรณ์ นี่เป็นไปไม่ได้ด้วยJDialog
และแน่นอนว่าจะเป็นไปไม่ได้ด้วยJInternalFrame
เช่นกัน ฉันเปลี่ยนมันกลับมาเป็นการแยกจากกันJFrames
เพื่อความมีสติของเขา แต่มันก็สอนบทเรียนสำคัญให้ฉันJInternalFrame
JFrame
จากประสบการณ์จริงของฉันJInternalFrames
มีความยืดหยุ่นน้อยกว่ามาก ฉันได้พัฒนาวิธีที่เป็นระบบในการจัดการการเปิด & ปิดของJFrame
s ในแอพของฉันที่ใช้งานได้ดีจริงๆ ฉันควบคุมเฟรมเกือบทั้งหมดจากภายในรหัสของเฟรมเอง การสร้างเฟรมใหม่, SwingWorker
s ที่ควบคุมการดึงข้อมูลบนเธรดพื้นหลังและรหัส GUI บน EDT, การเรียกคืน / นำไปด้านหน้าเฟรมหากผู้ใช้พยายามเปิดมันสองครั้ง, ฯลฯ สิ่งที่คุณต้องเปิดJFrame
คือ เรียกวิธีสาธารณะคงที่open()
และวิธีการเปิดรวมกับwindowClosing()
เหตุการณ์จัดการส่วนที่เหลือ (เฟรมเปิดอยู่แล้วหรือไม่เปิด แต่โหลดหรือไม่เป็นต้น) ฉันทำแบบนี้เป็นเทมเพลตดังนั้นจึงไม่ยากที่จะนำไปใช้กับแต่ละเฟรมJFrame
ต้องการพื้นที่มากกว่า a JInternalFrame
ถึงแม้ว่าคุณจะเปิด 100 JFrame
s คุณจะต้องใช้ทรัพยากรเพิ่มอีกเท่าไหร่? หากคุณกังวลคือการรั่วไหลของหน่วยความจำเพราะของทรัพยากร: โทรdispose()
ปลดปล่อยทรัพยากรทั้งหมดที่ใช้โดยกรอบการเก็บขยะ (และอีกครั้งที่ผมพูดเป็นJInternalFrame
ควรเรียกว่าความกังวลเดียวกัน)ฉันเขียนมากและฉันรู้สึกว่าฉันสามารถเขียนได้มากขึ้น อย่างไรก็ตามฉันหวังว่าฉันจะไม่ได้รับการโหวตเพียงเพราะมันเป็นความคิดเห็นที่ไม่เป็นที่นิยม คำถามนี้เป็นคำถามที่มีค่าอย่างชัดเจนและฉันหวังว่าฉันจะได้รับคำตอบที่มีค่าแม้ว่าจะไม่ใช่ความคิดเห็นทั่วไปก็ตาม
ตัวอย่างที่ดีของหลายเฟรม / เอกสารเดี่ยวต่อเฟรม ( SDI ) เทียบกับเฟรมเดี่ยว / หลายเอกสารต่อเฟรม ( MDI ) คือ Microsoft Excel ประโยชน์บางอย่างของ MDI:
SDI (อินเทอร์เฟซเอกสารเดียวคือหน้าต่างทุกบานสามารถมีเอกสารเดียว):
MDI (อินเทอร์เฟซหลายเอกสารกล่าวคือทุกหน้าต่างสามารถมีเอกสารหลายฉบับ):
JFrame
และพ่อแม่ใหญ่JTabbedPane
; แต่ด้วยความเป็นไปได้ที่จะเปิดหน้าต่างที่สอง (หรือมากกว่านั้น) ที่เลย์เอาต์อาจแตกต่างกันดังนั้นจึงมีพฤติกรรมแบบไฮบริดที่คนรัก SDI มีความสุขและ MDI เช่นกัน ในทุกกรณีฉันมักจะถือJInternalFrame
เป็นรูปแบบที่น่ากลัวซึ่งจะทำให้คุณไม่สะดวกทั้งโลก ความยืดหยุ่นที่พวกเขามีให้เพียงแค่ดูดและกินพื้นที่หน้าจอที่มีค่ามากมายโดยไม่มีวัตถุประสงค์จริง
JFrame
ได้รับไอคอนแถบงานของตัวเอง บางครั้งสิ่งนี้เป็นสิ่งที่คุณต้องการ แต่บางครั้งก็ไม่เป็นเช่นนั้น ใน WinAPI การกำหนดค่านี้ง่าย แต่ใน Swing ดูเหมือนว่าไม่สามารถทำได้
JDialog
JFrame
ฉันต้องการโต้แย้งการโต้เถียง "ไม่เป็นมิตรกับผู้ใช้" ด้วยตัวอย่างที่ฉันเพิ่งมีส่วนร่วม
ในแอปพลิเคชันของเราเรามีหน้าต่างหลักที่ผู้ใช้เรียกใช้ 'โปรแกรม' เป็นแท็บแยกต่างหาก มากที่สุดเท่าที่เป็นไปได้เราพยายามเก็บใบสมัครของเราไว้ในหน้าต่างเดียวนี้
หนึ่งใน 'โปรแกรม' ที่พวกเขาเรียกใช้จะแสดงรายการรายงานที่สร้างขึ้นโดยระบบและผู้ใช้สามารถคลิกที่ไอคอนในแต่ละบรรทัดเพื่อเปิดป๊อปอัพกล่องโต้ตอบตัวแสดงรายงาน ผู้ดูนี้แสดงเทียบเท่ากับหน้า A4 แนวตั้ง / แนวนอนของรายงานดังนั้นผู้ใช้เช่นหน้าต่างนี้จะค่อนข้างใหญ่เกือบเต็มหน้าจอ
ไม่กี่เดือนที่ผ่านมาเราเริ่มรับคำขอจากลูกค้าของเราเพื่อทำให้หน้าต่างตัวดูรายงานเหล่านี้ไม่มีการเปลี่ยนแปลงเพื่อให้พวกเขาสามารถเปิดรายงานหลายฉบับได้ในเวลาเดียวกัน
บางครั้งฉันคัดค้านการร้องขอนี้เพราะฉันไม่คิดว่านี่เป็นทางออกที่ดี อย่างไรก็ตามความคิดของฉันก็เปลี่ยนไปเมื่อฉันค้นพบว่าผู้ใช้มีการ 'แก้ไข' ระบบของเราอย่างไร
พวกเขากำลังเปิดตัวแสดงโดยใช้เครื่องมือ 'บันทึกเป็น' เพื่อบันทึกรายงานเป็น PDF ไปยังไดเรกทอรีที่ระบุโดยใช้ Acrobat Reader เพื่อเปิดไฟล์ PDF จากนั้นพวกเขาจะทำเช่นเดียวกันกับรายงานถัดไป พวกเขาจะมีผู้อ่าน Acrobat หลายคนที่ทำงานด้วยเอาต์พุตรายงานต่างๆที่พวกเขาต้องการดู
ดังนั้นฉันจึงผ่อนปรนและทำให้ผู้ดูไม่อยู่บ้าน ซึ่งหมายความว่าผู้ดูแต่ละคนจะมีไอคอนแถบงาน
เมื่อเวอร์ชันล่าสุดออกวางจำหน่ายเมื่อสัปดาห์ที่แล้วการตอบรับอย่างล้นหลามคือพวกเขารักมัน มันเป็นหนึ่งในการปรับปรุงล่าสุดที่เป็นที่นิยมมากที่สุดในระบบ
ดังนั้นคุณจึงไปข้างหน้าและบอกผู้ใช้ของคุณว่าสิ่งที่พวกเขาต้องการนั้นไม่ดี แต่ในที่สุดมันจะไม่ช่วยอะไรคุณ
หมายเหตุบางส่วน:
ModalityType
มากกว่าการmodal
โต้แย้งบูลีน นี่คือสิ่งที่ทำให้กล่องโต้ตอบเหล่านี้มีไอคอนแถบงานทำให้ jInternalFrame เป็นเฟรมหลักและทำให้มองไม่เห็น จากนั้นคุณสามารถใช้มันสำหรับกิจกรรมเพิ่มเติม
jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
เป็นเวลานานแล้วที่ฉันสัมผัสถึงการแกว่ง แต่โดยทั่วไปแล้วมันเป็นการฝึกฝนที่ไม่ดีเลย ข้อเสียเปรียบหลักบางประการที่อยู่ในใจ:
มันแพงกว่า:คุณจะต้องจัดสรรทรัพยากรให้มากขึ้นเพื่อวาด JFrame ที่คอนเทนเนอร์หน้าต่างชนิดอื่นเช่น Dialog หรือ JInternalFrame
ไม่เป็นมิตรกับผู้ใช้:ไม่ใช่เรื่องง่ายที่จะนำทางไปยังกลุ่ม JFrame ที่ติดกันมันจะดูเหมือนว่าแอปพลิเคชันของคุณเป็นชุดของแอปพลิเคชันที่ไม่สอดคล้องกันและการออกแบบไม่ดี
มันใช้งานง่าย JInternalFrameนี่เป็น retorical ตอนนี้มันง่ายกว่าและคนอื่น ๆ ฉลาดกว่า (หรือมีเวลาว่าง) มากกว่าที่เราคิดผ่านเดสก์ท็อปและ JInternalFrame ดังนั้นฉันอยากจะแนะนำให้ใช้
JInternalFrame
ด้วยหรือไม่ ส่วนตัวฉันไม่เห็นด้วยกับการใช้งานของJInternalFrame
! CardLayout
เป็นพรจริง!
JInternalFrame
ไม่มีข้อได้เปรียบใด ๆ ในทั้งสามกรณีที่คุณกล่าวถึง (1. หลักฐานที่JInternalFrame
เบากว่านั้นคือJFrame
อะไร 2. คุณJInternalFrame
อาจมีความยุ่งเหยิง / ยุ่งเหยิง / ติดกันอยู่ด้วยกันเป็นกลุ่มJFrame
3. มันJInternalFrame
ง่ายกว่าไหม รหัสที่แน่นอนเดียวกันยกเว้นหนึ่งอยู่ภายในJDesktopPane
และหนึ่งอยู่ภายในพื้นที่หน้าจอธรรมชาติพวกเขาเสียงที่ซับซ้อนอย่างเท่าเทียมกันกับฉัน.)
JComponent
s ทั้งคู่มีโครงสร้างที่เหมือนกันเกือบทั้งหมดยกเว้นว่ามีการแสดงผลบน a JDesktop
และหนึ่งไม่ อีกครั้งขอโทษ แต่ผมเชื่อว่าคุณจะคาดเดาเกี่ยวกับ "น้ำหนัก" JFrame
ของ 2. แอปพลิเคชันของฉันใช้ SDI และลูกค้าของฉันมีความสุขมาก อย่างไรก็ตามคุณพูดว่า "หน้าต่างหนึ่งบาน" ซึ่งแน่นอนว่าน่าจะดูด แต่ประเด็นของฉันคือ: "ตัน" JInternalFrame
จะดูดเหมือนเลว! หากคุณกำลังพูดว่า JIF ให้คุณเป็นนักออกแบบ UI ที่เลอะเทอะแสดงว่านั่นแย่มาก ระเบียบรกเป็นระเบียบรกไม่ว่าจะเป็น JF หรือ JIF
การปฏิบัติที่ไม่ดีอย่างแน่นอน เหตุผลหนึ่งก็คือมันไม่ 'ใช้งานง่าย' มากนักเพราะทุกคนJFrame
แสดงไอคอนแถบงานใหม่ การควบคุมหลายJFrame
s คุณจะต้องถอนผมออก
โดยส่วนตัวฉันจะใช้ ONE JFrame
สำหรับแอปพลิเคชันของคุณ วิธีการแสดงสิ่งต่าง ๆ นั้นขึ้นอยู่กับคุณมีหลายวิธี Canvas
ES, JInternalFrame
, CardLayout
แม้JPanel
s อาจ
วัตถุ JFrame หลายรายการ = ความเจ็บปวดปัญหาและปัญหา
ฉันคิดว่าการใช้หลายรายการJframe
ไม่ใช่ความคิดที่ดี
แต่เราสามารถใช้JPanel
มากกว่าหนึ่งอย่างJPanel
ในที่เดียวกันJFrame
ได้
นอกจากนี้เราสามารถสลับไปมาระหว่างนี้JPanel
s JFrame
ดังนั้นมันทำให้เรามีเสรีภาพในการแสดงผลมากกว่าสิ่งใน
สำหรับJPanel
เราแต่ละคนสามารถออกแบบสิ่งต่าง ๆ และทั้งหมดนี้JPanel
สามารถแสดงบนJFrame
หนึ่งครั้ง
เพื่อสลับระหว่างการJPanel
ใช้งานนี้JMenuBar
กับJMenuItems
สำหรับแต่ละJPanel
หรือ 'JButton for each
JPanel`
มากกว่าหนึ่งJFrame
ไม่ได้เป็นวิธีปฏิบัติที่ดี JFrame
แต่มีอะไรผิดปกติถ้าเราต้องการมากกว่าหนึ่ง
แต่มันจะดีกว่าที่จะเปลี่ยนหนึ่งJFrame
สำหรับความต้องการที่แตกต่างกันของเราแทนที่จะมีหลายJFrame
s
หากเฟรมจะมีขนาดเท่ากันทำไมไม่สร้างเฟรมและส่งเฟรมแล้วเป็นการอ้างอิงถึงเฟรมนั้นแทน
เมื่อคุณผ่านเฟรมไปแล้วคุณสามารถตัดสินใจว่าจะเติมมันอย่างไร มันเหมือนมีวิธีในการคำนวณค่าเฉลี่ยของชุดตัวเลข คุณจะสร้างวิธีนี้ซ้ำแล้วซ้ำอีก?
มันไม่ใช่วิธีปฏิบัติที่ดี แต่แม้ว่าคุณต้องการใช้มันคุณสามารถใช้รูปแบบซิงเกิลที่ดี ฉันใช้รูปแบบซิงเกิลในโครงการส่วนใหญ่ของฉันมันดี