ฉันกำลังพัฒนาแอพพลิเคชั่นที่แสดงภาพและเล่นเสียงจากฐานข้อมูล ฉันกำลังพยายามตัดสินใจว่าจะใช้ 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)
JFrames ก่อนและไม่เคยพิจารณาปัญหาเหล่านั้นขอบคุณสำหรับการอธิบาย!
JFrameวิธีการหลายอย่างเป็นสิ่งที่ฉันนำไปใช้ตั้งแต่เริ่มเขียนโปรแกรมแอพ Swing ส่วนใหญ่ฉันทำตั้งแต่แรกเพราะไม่รู้อะไรเลย อย่างไรก็ตามเมื่อฉันครบกำหนดในประสบการณ์และความรู้ของฉันในฐานะนักพัฒนาและเมื่อเริ่มอ่านและรับฟังความคิดเห็นของ Java devs ที่มีประสบการณ์มากขึ้นทางออนไลน์ฉันพยายามเปลี่ยนจากหลายJFrameแนวทาง (ทั้งในโครงการปัจจุบันและโครงการในอนาคต ) เท่านั้นที่จะได้พบกับ ... รับสิ่งนี้ ... ความต้านทานจากลูกค้าของฉัน! เมื่อฉันเริ่มใช้กล่องโต้ตอบโมดอลเพื่อควบคุมหน้าต่างและลูก "ย่อย" JInternalFrameสำหรับส่วนประกอบแยกกันลูกค้าของฉันเริ่มบ่น!ฉันค่อนข้างประหลาดใจเมื่อฉันทำสิ่งที่ฉันคิดว่าเป็นการปฏิบัติที่ดีที่สุด! แต่อย่างที่พวกเขาพูดว่า "ภรรยาที่มีความสุขคือชีวิตที่มีความสุข" กันไปสำหรับลูกค้าของคุณ แน่นอนฉันเป็นผู้รับเหมาดังนั้นผู้ใช้ของฉันสามารถเข้าถึงฉันโดยตรงผู้พัฒนาซึ่งเห็นได้ชัดว่าไม่ใช่สถานการณ์ทั่วไป
ดังนั้นฉันจะอธิบายถึงประโยชน์ของJFrameวิธีการที่หลากหลายรวมถึงตำนานที่เล่าขานถึงข้อเสียที่คนอื่นนำเสนอ
JFrameผู้ใช้ปลายทางของคุณเพื่อกระจายและควบคุมสิ่งที่อยู่บนหน้าจอของเขา / เธอ แนวคิดดังกล่าวให้ความรู้สึก "เปิดกว้าง" และไม่มีการ จำกัด คุณจะสูญเสียนี้เมื่อคุณไปสู่ขนาดใหญ่JFrameและพวงของJInternalFramesJFrameเอส อย่างไรก็ตามฉันต้องการให้หน้าจอป้อนข้อมูลเป็นJDialogผู้ปกครองซึ่งเป็นผู้ดูข้อมูล ฉันทำการเปลี่ยนแปลงและทันทีที่ฉันได้รับโทรศัพท์จากผู้ใช้ปลายทางซึ่งพึ่งพาอย่างมากกับความจริงที่ว่าเขาสามารถย่อหรือปิดโปรแกรมดูและเปิดโปรแกรมแก้ไขในขณะที่เขาอ้างอิงส่วนอื่นของโปรแกรม (หรือเว็บไซต์ฉันไม่ได้ จำไม่ได้) เขาไม่ได้อยู่บนจอภาพหลายจอดังนั้นเขาต้องการไดอะล็อกการเข้าร่วมเป็นอันดับแรกและอย่างอื่นเป็นอันดับสองโดยซ่อนตัวดูข้อมูลไว้อย่างสมบูรณ์ นี่เป็นไปไม่ได้ด้วยJDialogและแน่นอนว่าจะเป็นไปไม่ได้ด้วยJInternalFrameเช่นกัน ฉันเปลี่ยนมันกลับมาเป็นการแยกจากกันJFramesเพื่อความมีสติของเขา แต่มันก็สอนบทเรียนสำคัญให้ฉันJInternalFrame JFrameจากประสบการณ์จริงของฉันJInternalFramesมีความยืดหยุ่นน้อยกว่ามาก ฉันได้พัฒนาวิธีที่เป็นระบบในการจัดการการเปิด & ปิดของJFrames ในแอพของฉันที่ใช้งานได้ดีจริงๆ ฉันควบคุมเฟรมเกือบทั้งหมดจากภายในรหัสของเฟรมเอง การสร้างเฟรมใหม่, SwingWorkers ที่ควบคุมการดึงข้อมูลบนเธรดพื้นหลังและรหัส GUI บน EDT, การเรียกคืน / นำไปด้านหน้าเฟรมหากผู้ใช้พยายามเปิดมันสองครั้ง, ฯลฯ สิ่งที่คุณต้องเปิดJFrameคือ เรียกวิธีสาธารณะคงที่open()และวิธีการเปิดรวมกับwindowClosing() เหตุการณ์จัดการส่วนที่เหลือ (เฟรมเปิดอยู่แล้วหรือไม่เปิด แต่โหลดหรือไม่เป็นต้น) ฉันทำแบบนี้เป็นเทมเพลตดังนั้นจึงไม่ยากที่จะนำไปใช้กับแต่ละเฟรมJFrameต้องการพื้นที่มากกว่า a JInternalFrameถึงแม้ว่าคุณจะเปิด 100 JFrames คุณจะต้องใช้ทรัพยากรเพิ่มอีกเท่าไหร่? หากคุณกังวลคือการรั่วไหลของหน่วยความจำเพราะของทรัพยากร: โทร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อาจมีความยุ่งเหยิง / ยุ่งเหยิง / ติดกันอยู่ด้วยกันเป็นกลุ่มJFrame3. มันJInternalFrameง่ายกว่าไหม รหัสที่แน่นอนเดียวกันยกเว้นหนึ่งอยู่ภายในJDesktopPaneและหนึ่งอยู่ภายในพื้นที่หน้าจอธรรมชาติพวกเขาเสียงที่ซับซ้อนอย่างเท่าเทียมกันกับฉัน.)
JComponents ทั้งคู่มีโครงสร้างที่เหมือนกันเกือบทั้งหมดยกเว้นว่ามีการแสดงผลบน a JDesktopและหนึ่งไม่ อีกครั้งขอโทษ แต่ผมเชื่อว่าคุณจะคาดเดาเกี่ยวกับ "น้ำหนัก" JFrameของ 2. แอปพลิเคชันของฉันใช้ SDI และลูกค้าของฉันมีความสุขมาก อย่างไรก็ตามคุณพูดว่า "หน้าต่างหนึ่งบาน" ซึ่งแน่นอนว่าน่าจะดูด แต่ประเด็นของฉันคือ: "ตัน" JInternalFrameจะดูดเหมือนเลว! หากคุณกำลังพูดว่า JIF ให้คุณเป็นนักออกแบบ UI ที่เลอะเทอะแสดงว่านั่นแย่มาก ระเบียบรกเป็นระเบียบรกไม่ว่าจะเป็น JF หรือ JIF
การปฏิบัติที่ไม่ดีอย่างแน่นอน เหตุผลหนึ่งก็คือมันไม่ 'ใช้งานง่าย' มากนักเพราะทุกคนJFrameแสดงไอคอนแถบงานใหม่ การควบคุมหลายJFrames คุณจะต้องถอนผมออก
โดยส่วนตัวฉันจะใช้ ONE JFrameสำหรับแอปพลิเคชันของคุณ วิธีการแสดงสิ่งต่าง ๆ นั้นขึ้นอยู่กับคุณมีหลายวิธี CanvasES, JInternalFrame, CardLayoutแม้JPanels อาจ
วัตถุ JFrame หลายรายการ = ความเจ็บปวดปัญหาและปัญหา
ฉันคิดว่าการใช้หลายรายการJframeไม่ใช่ความคิดที่ดี
แต่เราสามารถใช้JPanelมากกว่าหนึ่งอย่างJPanelในที่เดียวกันJFrameได้
นอกจากนี้เราสามารถสลับไปมาระหว่างนี้JPanels JFrameดังนั้นมันทำให้เรามีเสรีภาพในการแสดงผลมากกว่าสิ่งใน
สำหรับJPanelเราแต่ละคนสามารถออกแบบสิ่งต่าง ๆ และทั้งหมดนี้JPanelสามารถแสดงบนJFrameหนึ่งครั้ง
เพื่อสลับระหว่างการJPanelใช้งานนี้JMenuBarกับJMenuItemsสำหรับแต่ละJPanelหรือ 'JButton for eachJPanel`
มากกว่าหนึ่งJFrameไม่ได้เป็นวิธีปฏิบัติที่ดี JFrameแต่มีอะไรผิดปกติถ้าเราต้องการมากกว่าหนึ่ง
แต่มันจะดีกว่าที่จะเปลี่ยนหนึ่งJFrameสำหรับความต้องการที่แตกต่างกันของเราแทนที่จะมีหลายJFrames
หากเฟรมจะมีขนาดเท่ากันทำไมไม่สร้างเฟรมและส่งเฟรมแล้วเป็นการอ้างอิงถึงเฟรมนั้นแทน
เมื่อคุณผ่านเฟรมไปแล้วคุณสามารถตัดสินใจว่าจะเติมมันอย่างไร มันเหมือนมีวิธีในการคำนวณค่าเฉลี่ยของชุดตัวเลข คุณจะสร้างวิธีนี้ซ้ำแล้วซ้ำอีก?
มันไม่ใช่วิธีปฏิบัติที่ดี แต่แม้ว่าคุณต้องการใช้มันคุณสามารถใช้รูปแบบซิงเกิลที่ดี ฉันใช้รูปแบบซิงเกิลในโครงการส่วนใหญ่ของฉันมันดี