Search code examples
javaactionlistenerjradiobutton

Create boolean to show true when correct JRadioButtons have been selected


previous related question: Check which jRadioButtons have been selected if they have been created in a loop

I now want to create a boolean, that when all correct JRadioButtons are selected from each row, this boolean will be true.

To clarify, it can only be true when all radio buttons are selected, one from each row, that are the correct ones.

The code below already prints a line of the row and btn only when the correct JRadioButton is selected, but I'm not sure how to now implement this into what I'm looking for. Thanks in advance

//loop for making flow layout for each line of random letters
//counter for having number of the row next to each row in order of selection
int counter = x;
for(int i = 0; i < x; i++)
{
    //new jpanel created for every row needed for the word
    JPanel jpLine = new JPanel(new FlowLayout());

    //new jlabel made with counter number for each row
    JLabel count = new JLabel(Integer.toString(counter));
    jpLine.add(count);
    counter--;
    //random number from 0-5 generated for each row
    Random number = new Random();
    int low = 0;
    int high = 5;
    int ranNumber = number.nextInt((high - low) + low);

    //buttongroup outside loop so only one button can be pressed for each row
    ButtonGroup bg = new ButtonGroup();

    //get selected button's index in any group with bg.getSelection().getActionCommand()
    final int row = i;
    final ButtonGroup btnG = bg;
    ActionListener listener = new ActionListener() 
    {
        public void actionPerformed(ActionEvent e) 
        {

            //correct.setText("correct");

            System.out.println("row " + row);
            System.out.println("btn " + btnG.getSelection().getActionCommand());



        }
    };

    //loop for making the number of letters in each row - always going to be 6 letters to choose from in each row
    for(int j = 0; j < 5; j++)
    {
        //if the random number generated for each row equals the loop
        //then new radiobutton will be created for the ith letter of the reversed
        //answer, starting from charAt 0 and going to the last character
        if(ranNumber == j)
        {
            JRadioButton answerLetter = new JRadioButton("<html><font color = 'white'>" + answerForGrid.charAt(i) + "</font></html>");

            bg.add(answerLetter);
            answerLetter.setBackground(Color.decode("#566771"));
            answerLetter.setOpaque(true);
            jpLine.add(answerLetter);

            //use setActionCommand("" + j) on each button to associate each button with its index
            answerLetter.setActionCommand("" + j);
            answerLetter.addActionListener(listener);
        }

        //ranLetter is generated randomly from the alphabet string, so random letters are
        //created for each jradiobutton
        final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        final int N = alphabet.length();

        Random letter = new Random();
        char ranLetter;

        while(true) 
        {
            ranLetter = alphabet.charAt(letter.nextInt(N));
            break;
        }

        JRadioButton k = new JRadioButton("<html><font color = 'white'>" + ranLetter + "</font></html>");

        bg.add(k);
        k.setBackground(Color.decode("#566771"));
        k.setOpaque(true);
        jpLine.add(k);
    }
    //add each row of letters (jpLine) to this loops jpanel
    jpCenterCenter.add(jpLine);
}

Solution

  • Working with your code, you could declare an array of booleans before the initial loop like so:

    int counter = x;
    boolean[] responses = new boolean[x]
    for(int i = 0; i < x; i++)
    {
         //new jpanel created for every row needed for the word
         JPanel jpLine = new JPanel(new FlowLayout());
    

    Then you want to edit your actionListener to switch the row's boolean to true when selected. Important to note that if you do this, you need to add the listener to the other buttons, so that if a user selects the correct choice, then switches to the wrong choice, the boolean returns to false.

    ActionListener listener = new ActionListener() 
    {
        public void actionPerformed(ActionEvent e) 
        {
    
            //correct.setText("correct");
    
            String action = e.getActionCommand();
    
            if (action.equals("Incorrect")) {
                reponses[row] = false;
            }
            else {
                responses[row] = true;
                System.out.println("row " + row);
                System.out.println("btn " + action);
            }
    
    
        }
    };
    

    Don't forget to add this to your other buttons here:

    JRadioButton k = new JRadioButton("<html><font color = 'white'>" + ranLetter + "</font></html>");
    k.setActionCommand("Incorrect");
    k.addActionListener(listener);
    

    Then you could add a separate method to check if all responses are set to true:

    private boolean checkAnswers(boolean[] responses) {
        for (boolean b : responses) {
            if (!b) return false
        }
        return true;
    }