GridBagLayout เป็น Layout Manager ที่ยืดหยุ่นมาก จัดวางคอมโพเนนต์สัมพัทธ์กันด้วย Constraints แต่ละ GridBagLayout ใช้กริดสี่เหลี่ยมไดนามิก แต่ละคอมโพเนนต์ครอบครอง 1 หรือหลายเซลล์ เรียกว่า display area แต่ละคอมโพเนนต์เชื่อมโยงกับอินสแตนซ์ GridBagConstraints ที่ระบุการจัดวางใน display area
GridBagConstraints
ปรับแต่ง GridBagConstraints ได้โดยตั้งค่าตัวแปร instance สาธารณะ ตัวแปรเหล่านี้ระบุ ตำแหน่ง, ขนาด, ตัวคูณการเติบโต, anchor, inset, filling, padding
- gridx: int ระบุเซลล์ซ้ายสุดที่คอมโพเนนต์ครอบครอง (คอลัมน์)
- gridy: int ระบุเซลล์บนสุดที่คอมโพเนนต์ครอบครอง (แถว)
- gridheight: int จำนวนเซลล์แนวตั้งที่คอมโพเนนต์ครอบครอง
- gridwidth: int จำนวนเซลล์แนวนอนที่คอมโพเนนต์ครอบครอง
- ipadx: int padding แนวนอนภายในแต่ละคอนโทรล
- ipady: int padding แนวตั้งภายในแต่ละคอนโทรล
- insets: Insets object ระบุพื้นที่ว่างแต่ละด้านของเซลล์
- weightx: double กระจายพื้นที่แนวนอนเพิ่มเติม
- weighty: double กระจายพื้นที่แนวตั้งเพิ่มเติม
- anchor: int จัดตำแหน่งคอมโพเนนต์ภายในเซลล์
- fill: int จัดการพื้นที่เหลือในเซลล์
- RELATIVE: สำหรับ gridx/gridy วางติดคอมโพเนนต์ล่าสุด สำหรับ gridwidth/gridheight เป็น next-to-last ในแถว/คอลัมน์
- REMAINDER: สำหรับ gridwidth/gridheight ระบุเป็นคอมโพเนนต์สุดท้ายในแถว/คอลัมน์
ตัวอย่างโค้ด
import java.awt.*;
import javax.swing.*;
public class GridBagLayoutTest {
public static void main(String[] a) {
JFrame frame = new JFrame("GridBagLayout Test");
Container myPane = frame.getContentPane();
myPane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
setMyConstraints(c, 0, 0, GridBagConstraints.CENTER);
myPane.add(getFieldPanel(), c);
setMyConstraints(c, 0, 1, GridBagConstraints.CENTER);
myPane.add(getButtonPanel(), c);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 250);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static JPanel getFieldPanel() {
JPanel p = new JPanel(new GridBagLayout());
p.setBorder(BorderFactory.createTitledBorder("Details"));
GridBagConstraints c = new GridBagConstraints();
setMyConstraints(c, 0, 0, GridBagConstraints.EAST);
p.add(new JLabel("Name:"), c);
setMyConstraints(c, 1, 0, GridBagConstraints.WEST);
p.add(new JTextField(16), c);
setMyConstraints(c, 0, 1, GridBagConstraints.EAST);
p.add(new JLabel("System:"), c);
setMyConstraints(c, 1, 1, GridBagConstraints.WEST);
p.add(getSystemPanel(), c);
setMyConstraints(c, 0, 2, GridBagConstraints.EAST);
p.add(new JLabel("Language:"), c);
setMyConstraints(c, 1, 2, GridBagConstraints.WEST);
p.add(getLanguagePanel(), c);
setMyConstraints(c, 0, 3, GridBagConstraints.EAST);
p.add(new JLabel("Year:"), c);
setMyConstraints(c, 1, 3, GridBagConstraints.WEST);
p.add(new JComboBox(new String[]{"2019", "2020", "2021"}), c);
return p;
}
private static JPanel getButtonPanel() {
JPanel p = new JPanel(new GridBagLayout());
p.add(new JButton("OK"));
p.add(new JButton("Cancel"));
return p;
}
private static JPanel getSystemPanel() {
JRadioButton winButton = new JRadioButton("Windows", true);
JRadioButton macButton = new JRadioButton("Mac", false);
ButtonGroup systemGroup = new ButtonGroup();
systemGroup.add(winButton);
systemGroup.add(macButton);
JPanel p = new JPanel(new GridBagLayout());
p.add(winButton);
p.add(macButton);
return p;
}
private static JPanel getLanguagePanel() {
JPanel p = new JPanel(new GridBagLayout());
p.add(new JCheckBox("Java", true));
p.add(new JCheckBox("Python", true));
p.add(new JCheckBox("Spark", false));
return p;
}
private static void setMyConstraints(GridBagConstraints c, int gridx, int gridy, int anchor) {
c.gridx = gridx;
c.gridy = gridy;
c.anchor = anchor;
}
}
ผลลัพธ์
