更改JRadioButtons在JPanel上显示的方式

时间:2014-01-05 21:01:39

标签: java swing netbeans

我有JPanel,我想向其添加JRadioButtons,这是我尝试过的代码:

private void populateQuestionnaire(Question question){
            buttonGroup = new ButtonGroup();
            for(Choix c : question.getListChoix()) {
                radioButton = new JRadioButton(c.getChoixLibelle());
                buttonGroup.add(radioButton);
                jPanel1.add(radioButton);

            }
            jPanel1.revalidate();   
            jPanel1.repaint();
    }

我的JPanel布局为FlowLayout

这是JRadioButtons显示的方式:

enter image description here

我希望JRadioButtons一个在另一个之下添加,并在JPanel中居中。

2 个答案:

答案 0 :(得分:3)

您可以使用BoxLayout,而不是使用FlowLayout从左到右排列项目并进行适当包装,而不是LayoutManager,它允许您指定水平或垂直布置项目。

您可以在构建时为JPanel设置JPanel jpanel1 = new JPanel(new BoxLayout(parentComponent, BoxLayout.Y_AXIS));

{{1}}

答案 1 :(得分:1)

BoxLayout非常适合将元素堆叠在一起。请考虑以下代码:

public class MyFrame extends JFrame {

    public MyFrame() {
        ButtonGroup bg = new ButtonGroup();
        JRadioButton b1 = new JRadioButton("My Button 1");
        JRadioButton b2 = new JRadioButton("My Button 2");
        bg.add(b1);
        bg.add(b2);

        BoxLayout bl = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS);
        this.setLayout(bl);

        b1.setAlignmentX(CENTER_ALIGNMENT);
        b2.setAlignmentX(CENTER_ALIGNMENT);

        this.add(b1);
        this.add(b2);
    }

}

在实例化和显示时,会出现以下窗口:

Screenshot

现在让我们看看这段代码是如何工作的:

考虑以下代码:

ButtonGroup bg = new ButtonGroup();
JRadioButton b1 = new JRadioButton("My Button 1");
JRadioButton b2 = new JRadioButton("My Button 2");
bg.add(b1);
bg.add(b2);

这段代码与你之前做的一样,只是为了简单起见,这只是一点点简单。它创建一个按钮组和两个JRadioButton,然后将按钮添加到按钮组。现在是时候它变得有趣了。

接下来,请考虑以下代码:

BoxLayout bl = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS);
this.setLayout(bl);

第一行创建一个包含以下参数的新BoxLayout

1正在铺设的容器。 (它需要这个,因为它无法共享。)

2应该布置组件的轴。 (你想要Y-AXIS。)

第二行是JFrame的contentPane布局到你刚刚创建的BoxLayout

最后,请考虑以下代码:

b1.setAlignmentX(CENTER_ALIGNMENT);
b2.setAlignmentX(CENTER_ALIGNMENT);

this.add(b1);
this.add(b2);

这将设置两个单选按钮的对齐方式,使其中心彼此对齐并与帧的中心对齐。然后将它们添加到框架的内容窗格中。

希望这有帮助!

注意:我在构建this.getContentPane()而不是仅使用BoxLayout时使用this的原因是因为在使用{{1}等JFrames命令时}和add()被重定向到框架的内容窗格。因此,如果我们在构造函数中使用setLayout(),当我们调用this时,我们真的会调用this.setLayout(bl)。但是,我们只是告诉this.getContentPane().setLayout(bl)它将布置框架,而不是它的内容窗格,因此您将得到一个例外,说明BoxLayout无法共享。要纠正错误,我们只需要意识到我们实际上是通过框架的方法处理内容窗格,并相应地更新BoxLayout的构造函数,让它知道真正正在布局的内容。