Java 中的 GridBagConstraints 类的重要性是什么?
awtjavaobject oriented programmingprogrammingswing
GridBagLayout 是一种非常灵活的布局管理器,它允许我们使用 约束 将组件相对于彼此定位。每个 GridBagLayout 使用一个动态的矩形单元格网格,每个组件占据一个或多个单元格,称为其显示区域。由 GridBagLayout 管理的每个组件都与一个 GridBagConstraints 实例相关联,该实例指定组件在其显示区域内的布局方式。
GridBagConstraints
我们可以通过设置其一个或多个公共实例变量来自定义 GridBagConstraints 对象。这些变量指定组件的位置、大小、增长因子、锚点、插入、填充和内边距。
- gridx:一个 int 值,指定组件所占的最左侧单元格。gridx 指定将放置组件的列。
- gridy:一个 int 值,指定组件所占的最顶部单元格。 gridy 指定要放置它的行。
- gridheight:一个 int 值,指定组件占用的垂直单元格数。
- gridwidth:一个 int 值,指定组件占用的水平单元格数。
- ipadx:一个 int 值,指定要添加到每个控件的内部水平填充量。
- ipady:一个 int 值,指定要添加到每个控件的内部垂直填充量。
- insets:一个 Insets 对象,指定在单元格每侧留出的空白量。
- weightx:一个双精度值,指定如果生成的布局水平方向小于区域,如何分配额外的水平空间分配。
- weighty:一个双精度值,指定如果最终布局在垂直方向上小于分配的区域,如何分配额外的垂直空间。
- anchor:一个 int 值,指定组件在单元格内的对齐方式。
- fill:一个 int 值,指定如何处理单元格中的额外空间。
- RELATIVE:对于 gridx 和 gridy 字段,此字段指定组件将放置在最后添加的组件旁边。对于 gridwidth 和 gridheight 字段,此字段指定组件将是行或列中的倒数第二个组件。
- 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; } }