Enoch
Enoch

Reputation: 252

How to randomly select a button in a ButtonGroup of JRadioButtons?

I want to have a random radio button to be selected whenever this panel gets initialized, but I'm not sure how/if I can do that.

Is there a way to get a random button from the group and select it?

import javax.swing.*;

public class RandomPanel extends JPanel
{
    private ButtonGroup buttonGroup;
    private String[] buttonText =
            {
                    "Red",
                    "Mashed Potatoes",
                    "Metal",
                    "Running",
                    "Butts",
                    "Turquoise"
            };

    public RandomPanel()
    {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBorder(BorderFactory.createTitledBorder("Random Selections"));

        buttonGroup = new ButtonGroup();
        for (String text : buttonText)
        {
            JRadioButton option = new JRadioButton(text);
            add(option);
            button.add(option);
        }
    }

}

Upvotes: 0

Views: 1153

Answers (4)

Carlos
Carlos

Reputation: 87

I created a small method that allow me to set any radio group button. Very convenient if you don't want to use if for any radio button.

public void setButtonGroup(int rdValue, Enumeration elements ){
    while (elements.hasMoreElements()){
        AbstractButton button = (AbstractButton)elements.nextElement();
        if(Integer.parseInt(button.getActionCommand())==rdValue){
            button.setSelected(true);
        }
    }
}

then

setButtonGroup(randomIndex, yourButtonGroup.getElements());

Upvotes: 0

josemr
josemr

Reputation: 263

I believe you are looking for something like the solution below.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

public class RandomPanel extends JPanel
{
    private ButtonGroup buttonGroup;
    private String[] buttonText =
            {
                    "Red",
                    "Mashed Potatoes",
                    "Metal",
                    "Running",
                    "Butts",
                    "Turquoise"
            };

    private JRadioButton[] radioButton;

    Random r = new Random();

    public RandomPanel()
    {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBorder(BorderFactory.createTitledBorder("Random Selections"));

        buttonGroup = new ButtonGroup();

        radioButton = new JRadioButton[buttonText.length];

        for(int rb=0; rb<buttonText.length; rb++)
        {
            radioButton[rb] = new JRadioButton(buttonText[rb]);
            add(radioButton[rb]);
            buttonGroup.add(radioButton[rb]);
        }

        JButton b = new JButton("Random");
        b.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                selectRandomButton();
            }
        });

        add(b);
    }

    public void selectRandomButton()
    {
        radioButton[r.nextInt(radioButton.length)].setSelected(true);
    }

    public static void main(String[] args)
    {
        JFrame f = new JFrame("Test Random Button");
        f.setSize(300, 300);
        f.setLocationRelativeTo(null);;
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.add(new RandomPanel());

        f.setVisible(true);;
    }
}

Upvotes: 0

illgoforit
illgoforit

Reputation: 459

What you can do is keep a list/array of all the radio buttons you create, and then set the selected by using the button group's setSelected() method, something like this

buttonGroup.setSelected(buttonsArray[randomButtonNum].getModel(), true);

Upvotes: 2

Scott Stainton
Scott Stainton

Reputation: 394

Try using the Randomclass .

    // Library location
    import java.util.Random;

    //Inside some method
    Random r = new Random();
    randomIndex = r.nextInt(buttonText.length());
    text = buttonText[randomIndex];

This will need arranging to suit your implementation, whats shown is a 'how-to' usage.

Note: the argument to nextInt(args) is exclusive. i.e. will return 0 <= x < args

Upvotes: 1

Related Questions