Java: ความแตกต่างระหว่างเมธอด setPreferredSize () และ setSize () ในคอมโพเนนต์


105

อะไรคือความแตกต่างที่สำคัญระหว่างsetSize()และsetPreferredSize(). บางครั้งฉันก็ใช้setSize()บางครั้งบางครั้งsetPreferredSize()ก็ทำในสิ่งที่ฉันต้องการบางครั้ง

ฉันควรใช้สายอะไรสำหรับJFrames and JPanels?

คำตอบ:


116

การใช้งานขึ้นอยู่กับว่าพาเรนต์ของคอมโพเนนต์มีตัวจัดการโครงร่างหรือไม่

  • setSize() - ใช้เมื่อไม่มีตัวจัดการโครงร่างหลัก
  • setPreferredSize()(ยังเกี่ยวข้องsetMinimumSizeและsetMaximumSize) - ใช้เมื่อมีตัวจัดการโครงร่างหลัก

setSize()วิธีการอาจจะไม่ได้ทำอะไรถ้าพ่อแม่ของส่วนประกอบที่มีการใช้การจัดการรูปแบบ; สถานที่ที่มักจะมีผลกระทบจะอยู่ในส่วนประกอบระดับบนสุด ( JFrames และJWindows) และสิ่งที่อยู่ภายในบานหน้าต่างเลื่อน คุณต้องโทรหาsetSize()หากคุณมีส่วนประกอบภายในพาเรนต์ที่ไม่มีตัวจัดการเลย์เอาต์

โดยทั่วไปsetPreferredSize()จะจัดวางองค์ประกอบตามที่คาดไว้หากมีตัวจัดการโครงร่าง ตัวจัดการโครงร่างส่วนใหญ่ทำงานโดยรับขนาดของส่วนประกอบที่ต้องการ (เช่นเดียวกับขั้นต่ำและสูงสุด) จากนั้นใช้setSize()และsetLocation()วางตำแหน่งส่วนประกอบเหล่านั้นตามกฎของโครงร่าง

ตัวอย่างเช่นการBorderLayoutพยายามทำให้ขอบเขตของพื้นที่ "ทิศเหนือ" เท่ากับขนาดที่ต้องการขององค์ประกอบทางทิศเหนือซึ่งอาจมีขนาดใหญ่หรือเล็กกว่านั้นขึ้นอยู่กับขนาดของJFrameขนาดของส่วนประกอบอื่น ๆ ในเค้าโครงและอื่น ๆ


1
ฉันคิดว่าส่วนประกอบกำลังใช้ตัวจัดการเลย์เอาต์โดยค่าเริ่มต้น (BorderLayout?) ดังนั้นหากฉันไม่ได้ตั้งค่าตัวจัดการเลย์เอาต์อย่างชัดเจนนั่นหมายความว่าฉันควรใช้ setSize () แทน setPreferredSize ()?
David Robles

3
ฉันเชื่อว่า JPanels ใช้ BorderLayout เป็นค่าเริ่มต้น แต่ JComponent ไม่มีเค้าโครงเริ่มต้น โดยส่วนใหญ่แล้วคุณควรตั้งค่าตัวจัดการเลย์เอาต์มากกว่าหากคุณจะเพิ่มบางอย่างแทนที่จะใช้ setSize ()
Sbodd

8
คำแนะนำของฉันคือใช้ตัวจัดการเค้าโครงเสมอ ควรคิดว่า SetSize () เป็นสิ่งที่ผู้จัดการเค้าโครงเรียกไม่ใช่สิ่งที่คุณเรียก
Kevin Day

8
@Sbodd - JPanels มี FlowLayout โดยค่าเริ่มต้น JFrame.getContentPane () มี BorderLayout ตามค่าเริ่มต้น
Nemi

10

setSize()หรือsetBounds()สามารถใช้เมื่อไม่มีการใช้ตัวจัดการเค้าโครง

อย่างไรก็ตามหากคุณใช้ตัวจัดการโครงร่างคุณสามารถให้คำแนะนำแก่ผู้จัดการเค้าโครงโดยใช้setXXXSize()วิธีการเช่นsetPreferredSize()และsetMinimumSize()อื่น ๆ

และตรวจสอบให้แน่ใจว่าคอนเทนเนอร์ของคอมโพเนนต์ใช้ตัวจัดการโครงร่างที่สอดคล้องกับขนาดที่ร้องขอ FlowLayout, GridBagLayoutและSpringLayoutผู้จัดการใช้ขนาดที่ต้องการของส่วนประกอบ (ที่สองหลังขึ้นอยู่กับข้อ จำกัด ที่คุณตั้งไว้) แต่BorderLayoutและGridLayoutมักจะ don't.If คุณระบุคำแนะนำขนาดใหม่สำหรับองค์ประกอบที่มีอยู่แล้วมองเห็นคุณจะต้องเรียกวิธีการตรวจสอบใหม่ใน เพื่อให้แน่ใจว่ามีการวางลำดับชั้นการกักกันอีกครั้ง จากนั้นเรียกใช้วิธีการทาสีใหม่


5

setSize จะปรับขนาดส่วนประกอบให้เป็นขนาดที่ระบุ

setPreferredSizeกำหนดขนาดที่ต้องการ คอมโพเนนต์อาจไม่ได้มีขนาดเท่านี้ขึ้นอยู่กับขนาดของคอนเทนเนอร์ที่อยู่ในคอนเทนเนอร์หรือหากผู้ใช้ปรับขนาดคอมโพเนนต์ใหม่ด้วยตนเอง


คุณสามารถแสดงตัวอย่างที่สมบูรณ์ของ setPreferredSize (... ) ฉันคิดว่าสิ่งนี้จะเป็นประโยชน์
Doug Hauf

4

ไออาร์ซี ...

setSize กำหนดขนาดของส่วนประกอบ

setPreferredSizeกำหนดขนาดที่ต้องการ Layoutmanager จะพยายามจัดพื้นที่ให้กับส่วนประกอบของคุณ

ขึ้นอยู่กับว่าคุณใช้ตัวจัดการเลย์เอาต์หรือไม่ ...


และจะเกิดอะไรขึ้นถ้าฉันเพิ่ม jpanels สองตัวใน jframe โดยไม่ได้ระบุตัวจัดการเลย์เอาต์อย่างชัดเจนสำหรับ jframe? ฉันควรใช้วิธีใดในการกำหนดขนาดของ jpanels
David Robles

3
บานหน้าต่างเนื้อหาใช้ BorderLayout โดยค่าเริ่มต้น ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ) ดังนั้นแผงเนื้อหาของ JFrame จึงมี LayoutManager ดังนั้น setPreferredSize จึงควรใช้งานได้ ..
miku

ฟังดูดีนั่นหมายความว่าฉันควรใช้ setSize สำหรับ JFrame และ setPreferredSize สำหรับส่วนประกอบภายใน
David Robles

1
โดยทั่วไปคุณจะใช้ frame.pack () เพื่อใช้ประโยชน์จากขนาดที่ต้องการที่คำนวณได้ของส่วนประกอบย่อยทั้งหมด มิฉะนั้นหากคุณใช้ frame.setSize () แบบสุ่มส่วนประกอบที่เพิ่มในบานหน้าต่างเนื้อหาจะขยาย / หดให้พอดีกับพื้นที่ที่มีอยู่ซึ่งหมายความว่าขนาดที่ต้องการของแต่ละองค์ประกอบอาจถูกแทนที่
camickr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.