Search code examples
javaswingjbuttonjradiobutton

How to connect a JButton with a group of JRadioButtons?


I am creating a basic GUI frame. The frame has 10 radio buttons and a Submit button. The user selects one option(JRadioButtons) and clicks on the Submit(JButton) button. On clicking the Submit button, the option selected by the user appears on a different frame.

I want the Submit button to recognize the JRadioButton selected by the user. I have put my bit of code here for reference.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Frame2 extends JFrame{

private JFrame frame2;
private JLabel label2;
private JButton button2;
private JRadioButton r1;
private JRadioButton r2;
private JRadioButton r3;
private JRadioButton r4;
private JRadioButton r5;
private JRadioButton r6;
private JRadioButton r7;
private JRadioButton r8;
private JRadioButton r9;
private JRadioButton r10;
public ButtonGroup group;


Frame2(){
    setLayout(new BorderLayout());
    setSize(new Dimension(1304,690));
    getContentPane().setBackground(Color.DARK_GRAY);
    label2= new JLabel(" Choose a topic: ");
    label2.setFont(new Font("Seriff",Font.BOLD, 14));
    label2.setForeground(Color.WHITE);
    button2=new JButton("Submit");
    add(label2, BorderLayout.NORTH);        
    JPanel centerPanel = new JPanel(new GridLayout(2, 5));
    centerPanel.add(r1=new JRadioButton("Introduction"));
    centerPanel.add(r2=new JRadioButton("Class and Objects"));
    centerPanel.add(r3=new JRadioButton("Object Oriented Programming Concepts"));
    centerPanel.add(r4=new JRadioButton("JAVA literals, constants, variables"));
    centerPanel.add(r5=new JRadioButton("Loops"));
    centerPanel.add(r6=new JRadioButton("Functions/Methods"));
    centerPanel.add(r7=new JRadioButton("Strings"));
    centerPanel.add(r8=new JRadioButton("Arrays"));
    centerPanel.add(r9=new JRadioButton("Time Complexity"));
    centerPanel.add(r10=new JRadioButton("Data Structures"));
    add(centerPanel, BorderLayout.CENTER);
    group= new ButtonGroup();
    group.add(r1); 
    group.add(r2); 
    group.add(r3);
    group.add(r4);
    group.add(r5);
    group.add(r6);
    group.add(r7);
    group.add(r8);
    group.add(r9);
    group.add(r10);
    add(button2, BorderLayout.SOUTH);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
    
    button2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==button2) {
                Layouts l=new Layouts();
                l.main(null);
                dispose();
                
            }
            
        }
    });
}



public static void main(String[] args) {
    Frame2 fr2=new Frame2();
    
}   
}`

Thanks in advance.


Solution

  • It's a lot easier if you put the JRadioButtons in an array.

    Here are the changes I made to your code to make it easier to modify and understand.

    1. I added a call to the SwingUtilities invokeLater method to ensure the creation and execution of the Swing components happens on the Event Dispatch Thread.

    2. I created the individual JPanels in methods. By separating the JPanel code, I could more easily focus on one part of the GUI at a time.

    3. The methods to construct a JFrame must be called in the proper order. You have to create all the Swing components before you make the JFrame visible.

    Here's one way to connect a JButton with a group of JRadioButtons.

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.SwingUtilities;
    
    public class RadioButtonTest {
    
        private JButton button2;
    
        private JRadioButton[] rb;
    
        private ButtonGroup group;
    
        public RadioButtonTest() {
            JFrame frame = new JFrame("Java Tutorials");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBackground(Color.DARK_GRAY);
    
            frame.add(createMainPanel());
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new BorderLayout());
    
            JLabel label2 = new JLabel(" Choose a topic: ");
            label2.setFont(new Font("Seriff", Font.BOLD, 14));
            label2.setForeground(Color.WHITE);
            panel.add(label2, BorderLayout.NORTH);
    
            panel.add(createButtonPanel(), BorderLayout.CENTER);
    
            button2 = new JButton("Submit");
            button2.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == button2) {
                        for (int i = 0; i < rb.length; i++) {
                            if (rb[i].isSelected()) {
                                String text = rb[i].getText();
                                System.out.println(text);
                                // Do your second JFrame
                            }
                        }
                    }
                }
            });
            panel.add(button2, BorderLayout.SOUTH);
    
            return panel;
        }
    
        private JPanel createButtonPanel() {
            JPanel centerPanel = new JPanel(new GridLayout(0, 2));
    
            String[] titles = { "Introduction", "Class and Objects",
                    "Object Oriented Programming Concepts",
                    "JAVA literals, constants, variables", "Loops",
                    "Functions/Methods", "Strings", "Arrays",
                    "Time Complexity", "Data Structures" };
            rb = new JRadioButton[titles.length];
            group = new ButtonGroup();
    
            for (int i = 0; i < titles.length; i++) {
                rb[i] = new JRadioButton(titles[i]);
                group.add(rb[i]);
                centerPanel.add(rb[i]);
            }
    
            return centerPanel;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new RadioButtonTest();
                }
            });
        }
    
    }