You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:57:34