ปัญหาเค้าโครง Java Swing

ฉันกำลังออกแบบแอปพลิเคชันด้วย Java และไลบรารี Swing (ฉันสามารถใช้แฟรกเมนต์ของ AWT ได้ด้วย) และฉันต้องการความช่วยเหลือเกี่ยวกับเค้าโครง "กำหนดเอง"

ฉันมี JScrollPanel ขนาดใหญ่ ซึ่งฉันจะแทรก JPanels ของ ความสูงตัวแปร แบบไดนามิกเข้าไปข้างใน นี่คือการวาดที่สมจริงไม่มากก็น้อย:

|-------------------------------- JScrollPane ------------------------------|
| |------------------------------- JPanel --------------------------------| |
| |                                                                       | |
| |-----------------------------------------------------------------------| |
|                                                                           |
| |------------------------------- JPanel --------------------------------| |
| |                                                                       | |
| |                                                                       | |
| |-----------------------------------------------------------------------| |
|                                                                           |
|---------------------------------------------------------------------------|

ถ้าอย่างนั้น ฉันไม่รู้ว่าเลย์เอาต์ใดใช้.... ฉันต้องการให้ mainLayout ไม่ปรับขนาดความสูงของ JPanels ภายในของฉัน แต่เพื่อปรับขนาดความกว้าง ตัวอย่างเช่น เมื่อฉันขยายหน้าต่าง ฉันต้องการให้เลย์เอาต์ภายในของฉันอยู่ใกล้กับเส้นขอบซ้ายและขวา แต่ไม่ขยายในแนวตั้ง

ข้อเสนอแนะใด ๆ ?

ฉันหวังว่าภาษาอังกฤษและคำอธิบายของฉันจะไม่แย่เกินไป ขอบคุณที่อ่าน!


person Jerome    schedule 07.11.2013    source แหล่งที่มา
comment
ดูเหมือนว่าคุณจะต้องมีกล่องแนวตั้ง Box.createVerticalBox()   -  person michael nesterenko    schedule 08.11.2013


คำตอบ (1)


เลย์เอาต์ที่ฉันอาจใช้ในกรณีนี้คือ GridBagLayout หรือ VerticalLayout (จาก SwingLabs, ไลบรารี SwingX) (แต่เมื่อคุณมีเพียงแค่ค้อน ทุกอย่างก็ดูเหมือนตะปู ;))

หากต้องการใช้ GridBagLayout คุณจะต้องระบุข้อจำกัดที่เหมาะสมซึ่งจะแนะนำให้ผู้จัดการเลย์เอาต์กรอกแผงในแนวนอน แต่ต้องคำนึงถึงความสูง

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;

ปัญหาเดียวของเรื่องนี้คือ GridBagLayout ชอบที่จะจัดองค์ประกอบให้อยู่ตรงกลางตำแหน่งกึ่งกลางของคอนเทนเนอร์หลัก คุณอาจต้องเพิ่มส่วนประกอบ "ตัวเติม" ลงในตำแหน่งสุดท้ายที่ใช้พื้นที่แนวตั้งที่เหลืออยู่

gbc.weighty = 1;

น่าจะพอแล้ว

ดู วิธีใช้ GridBagLayout เพื่อดูรายละเอียดเพิ่มเติม

อัปเดตด้วยตัวอย่างพื้นฐาน...

// Basic constraints...
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;

// Add your components...
add(panel, gbc);
//...

// Then add a fill component to push the layout to the top...
gbc.weighty = 1;
add(new JPanel(), gbc);
// You can use a constant value if you want, as it will be easier to remove
// so you can add new components to the end and re-add it when you're done
person MadProgrammer    schedule 07.11.2013
comment
ขอบคุณสำหรับคำตอบที่รวดเร็ว การใช้งานนี้ค่อนข้างได้ผล แต่ฉันยังคงให้ JPanels อยู่ตรงกลาง JScrollPane หลักของฉันในแนวตั้ง ฉันพยายามใช้ gbc.weithy = 1; แต่ดูเหมือนว่าจะไม่ได้ทำอะไรพิเศษ :( - person Jerome; 08.11.2013
comment
สมบูรณ์แบบ! ขอบคุณสำหรับตัวอย่างความคิดเห็น! - person Jerome; 08.11.2013