程序没有返回RadioButton的正确结果

时间:2014-04-01 20:54:28

标签: java swing jradiobutton

当我运行下面的代码时,前两个按钮不会出现;但是,第三个在框架中可见。

public class RadioButton {
    RadioButton(){
        JFrame frame = new JFrame();
        JRadioButton button1 = new JRadioButton("One");
        button1.setBounds(50, 20, 50, 20);
        JRadioButton button2 = new JRadioButton("Two");
        button2.setBounds(50, 50, 50, 20);
        JRadioButton button3 = new JRadioButton("Three");
        button2.setBounds(50, 80, 50, 20);
        ButtonGroup bg  = new ButtonGroup();
        bg.add(button1);
        bg.add(button2);
        bg.add(button3);
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new RadioButton();
    }

}

3 个答案:

答案 0 :(得分:1)

您需要为容器设置布局管理器,我建议您阅读tutorial

RadioButton(){
    JFrame frame = new JFrame();
    JRadioButton button1 = new JRadioButton("One");
    JRadioButton button2 = new JRadioButton("Two");
    JRadioButton button3 = new JRadioButton("Three");
    ButtonGroup bg  = new ButtonGroup();
    bg.add(button1);
    bg.add(button2);
    bg.add(button3);
    frame.getContentPane().setLayout(new FlowLayout());
    frame.add(button1);
    frame.add(button2);
    frame.add(button3);
    frame.setSize(300, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

答案 1 :(得分:1)

我猜是因为OP将布局管理器设置为null,所以绝对定位是想要的。通常不建议这样做。请参阅tutorial

您需要按如下方式重新排序代码 - 即在设置组件范围之前设置布局

public class RadioButton {

RadioButton() {
    JFrame frame = new JFrame();
    JRadioButton button1 = new JRadioButton("One");
    JRadioButton button2 = new JRadioButton("Two");
    JRadioButton button3 = new JRadioButton("Three");
    ButtonGroup bg = new ButtonGroup();
    frame.setLayout(null);
    bg.add(button1);
    bg.add(button2);
    bg.add(button3);
    frame.setSize(300, 300);
    frame.add(button1);
    frame.add(button2);
    frame.add(button3);
    button1.setBounds(50, 20, 80, 20);
    button2.setBounds(50, 50, 80, 20);
    button3.setBounds(50, 80, 80, 20);

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            frame.setVisible(true);
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    new RadioButton();
}
}

我正在使用OS X,我需要让按钮更大一些,以避免它们的字幕显示为“...”。最后我使用invokeLater,IIRC是最佳实践。

答案 2 :(得分:1)

JFrame的默认布局为BorderLayout。如果不指定区域,则添加的每个组件都将放入BorderLayout.CENTER。由于button3是最后添加的,因此它替换了button2(button2在添加时替换了button1)。您可以使用JPanel创建FlowLayout,然后在其中添加三个按钮。然后将JPanel添加到JFrame