如何使用Swing GridBagLayout正确对齐两个单选按钮
GridBagLayout布局问题:单选按钮无法相邻对齐
我使用GridBagLayout布局时始终达不到预期效果,尝试让两个JRadioButton相邻对齐,但它们之间的间隔一直很大,调整权重参数也没有作用。当前布局的设置为:标签跨2个单元格,每个单选按钮各占1个单元格,最后一行是跨2格的标签和跨2格的日期控件。或许GridBagLayout并不是合适的布局管理器?
原始代码
public class GridBagLayoutTest extends JFrame { private final JPanel addScorePanel; private final JTextField txtScore; private final JRadioButton rb9; private final JRadioButton rb18; private final JDateChooser dateChooserDate; public GridBagLayoutTest() { setLayout(new BorderLayout()); addScorePanel = new JPanel(); addScorePanel.setLayout(new GridBagLayout()); txtScore = new JTextField(3); rb9 = new JRadioButton("9"); rb9.setActionCommand("9"); rb18 = new JRadioButton("18"); rb18.setActionCommand("18"); rb18.setSelected(true); ButtonGroup bgHoles = new ButtonGroup(); bgHoles.add(rb9); bgHoles.add(rb18); dateChooserDate = new JDateChooser(); layoutControls(); add(addScorePanel, BorderLayout.NORTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 430); // Juggle for best look setMinimumSize(new Dimension(400, 375)); setLocationRelativeTo(null); setVisible(true); } private void layoutControls() { Border titleBorder = BorderFactory. createTitledBorder("Handicap Add Score"); int space = 15; Border spaceBorder = BorderFactory.createEmptyBorder(space, space, space, space); addScorePanel.setBorder(BorderFactory.createCompoundBorder(spaceBorder, titleBorder)); // setBorder(BorderFactory.createLineBorder(Color.BLACK)); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.NONE; // Controls preferred size, ////////// Score row ////////// gc.gridy = 0; gc.gridx = 0; gc.weightx = 1.0; gc.weighty = 1.0; gc.gridwidth = 2; // Label 2 cells gc.anchor = GridBagConstraints.FIRST_LINE_END; gc.insets = new Insets(15, 0, 0, 15); addScorePanel.add(new JLabel("Score: "), gc); gc.gridy = 0; gc.gridx = 2; // Skip over 2nd label cell gc.gridwidth = 1; gc.anchor = GridBagConstraints.FIRST_LINE_START; gc.insets = new Insets(15, 0, 0, 15); addScorePanel.add(txtScore, gc); ////////// Holes row ////////// gc.gridy++; gc.gridx = 0; // gc.weightx = 0.1; // gc.weighty = 1.0; gc.gridwidth = 2; // Label 2 cells gc.insets = new Insets(15, 0, 0, 15); gc.anchor = GridBagConstraints.FIRST_LINE_END; addScorePanel.add(new JLabel("Holes Played:"), gc); gc.gridx = 2; // Skip over 2nd label cell // gc.weightx = 0.1; gc.gridwidth = 1; gc.insets = new Insets(15, 0, 0, 0); gc.anchor = GridBagConstraints.FIRST_LINE_START; addScorePanel.add(rb9, gc); gc.gridx++; // Next cell // gc.weightx = 1.0; gc.gridwidth = 1; gc.insets = new Insets(15, 0, 0, 0); gc.anchor = GridBagConstraints.FIRST_LINE_START; addScorePanel.add(rb18, gc); ////////// Date row ////////// gc.gridy++; gc.gridx = 0; // gc.weightx = 1.0; // gc.weighty = 1.0; gc.gridwidth = 2; // Label 2 cells gc.insets = new Insets(15, 0, 0, 15); gc.anchor = GridBagConstraints.FIRST_LINE_END; addScorePanel.add(new JLabel("Date: "), gc); gc.gridx = 2; // Skip over 2nd label cell gc.gridwidth = 2; // Date 2 cells gc.anchor = GridBagConstraints.FIRST_LINE_START; addScorePanel.add(dateChooserDate, gc); } }
期望效果
标签(Score:、Holes Played:、Date:)右对齐,对应右侧的输入框、两个单选按钮(9和18)、日期选择控件紧凑排列,单选按钮之间没有过大的间距。
修改后的代码(根据@camickr建议)
////////// Score row ////////// gc.gridy = 0; gc.gridx = 0; gc.weightx = 1.0; gc.weighty = 1.0; gc.gridwidth = 1; // <----- // Label 2 cells gc.anchor = GridBagConstraints.FIRST_LINE_END; gc.insets = new Insets(15, 0, 0, 15); addScorePanel.add(new JLabel("Score: "), gc); gc.gridy = 0; gc.gridx = 1; // <----- // Skip over 2nd label cell gc.gridwidth = 2; // <----- gc.anchor = GridBagConstraints.FIRST_LINE_START; gc.insets = new Insets(15, 0, 0, 15); addScorePanel.add(txtScore, gc); ////////// Holes row ////////// gc.gridy++; gc.gridx = 0; // gc.weightx = 0.1; // gc.weighty = 1.0; gc.gridwidth = 1; // <----- // Label 2 cells gc.insets = new Insets(15, 0, 0, 15); gc.anchor = GridBagConstraints.FIRST_LINE_END; addScorePanel.add(new JLabel("Holes Played:"), gc); gc.gridx = 1; // <----- // Skip over 2nd label cell // gc.weightx = 0.1; gc.gridwidth = 1; gc.insets = new Insets(15, 0, 0, 0); gc.anchor = GridBagConstraints.FIRST_LINE_START; addScorePanel.add(rb9, gc); gc.gridx = 2; // <----- // Next cell // gc.weightx = 1.0; gc.gridwidth = 1; gc.insets = new Insets(15, 0, 0, 0); gc.anchor = GridBagConstraints.FIRST_LINE_START; addScorePanel.add(rb18, gc); ////////// Date row ////////// gc.gridy++; gc.gridx = 0; // gc.weightx = 1.0; // gc.weighty = 1.0; gc.gridwidth = 1; // <----- // Label 2 cells gc.insets = new Insets(15, 0, 0, 15); gc.anchor = GridBagConstraints.FIRST_LINE_END; addScorePanel.add(new JLabel("Date: "), gc); gc.gridx = 1; // Skip over 2nd label cell gc.gridwidth = 2; // Date 2 cells gc.anchor = GridBagConstraints.FIRST_LINE_START; addScorePanel.add(dateChooserDate, gc);
修改后效果几乎没有变化,我认为标记的修改位置是正确的。
内容的提问来源于stack exchange,提问作者todivefor
相关产品推荐
相关产品推荐

