我有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
显示的方式:
我希望JRadioButtons
一个在另一个之下添加,并在JPanel中居中。
答案 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);
}
}
在实例化和显示时,会出现以下窗口:
现在让我们看看这段代码是如何工作的:
考虑以下代码:
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的构造函数,让它知道真正正在布局的内容。