Проверьте, какие jRadioButtons были выбраны, если они были созданы в цикле

У меня есть цикл, который создает строки, где каждая строка имеет еще один цикл для создания 6 JRadioButtons.

Только один JRadioButton может быть выбран из каждой строки (как и должно быть), но мне трудно использовать прослушиватели действий, чтобы проверить, был ли выбран правильный JRadioButton из каждой строки, а затем изменить пустой JLabel, чтобы показать «правильный ", но я думаю, что это будет просто, как только я справлюсь с первой частью.

Это соответствующий код, с которым я работаю:

    //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) 
            {



                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);
    }

Кроме того, правильные JRadioButtons, которые я хочу проверить, - это те, которые созданы в разделе if(ranNumber == j).

Извините, если я затянул, но мне было трудно это объяснить, поэтому, надеюсь, кто-то сможет помочь!


person AEkon    schedule 01.02.2015    source источник


Ответы (1)


Вы можете использовать setActionCommand("" + j) для каждой кнопки, чтобы связать каждую кнопку с ее индексом, а затем получить индекс выбранной кнопки в любой группе с помощью bg.getSelection().getActionCommand(). Затем вы можете назначить один ActionListener для всех кнопок в одной группе и убедиться, что прослушиватель действий знает, к какой строке он прикреплен.

// in your "i" loop
final int row = i; // must be final to be used inside the anonymous class
final ButtonGroup btnG = bg;
final String answerAction = "" + ranNumber; // hard to tell if this is what you mean
ActionListener listener = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    System.out.println("row " + row);
    String selectedAction = btnG.getSelection().getActionCommand();
    System.out.println("btn " + selection);
    boolean isCorrectForThisRow = (answerAction == selectedAction);
    System.out.println("is correct: " + isCorrectForThisRow);
  }
};
// in your "j" loop, with either the answerLetter or k buttons
// as required
k.setActionCommand("" + j);
k.addActionListener(listener);

В нынешнем виде в вашем примере многое не совсем понятно, поэтому трудно предложить что-то большее (например, цикл while(true), который прерывается на первой итерации). Но setActionCommand предназначен для использования (учебник по оракулу здесь) в именно так можно узнать, какая кнопка отмечена в группе кнопок.

person Andy Brown    schedule 01.02.2015
comment
Спасибо, это было очень ясно, но еще один вопрос, поскольку я все еще очень новичок в ActionListeners, как я могу создать логическое значение, которое является истинным, когда все 6 правильных JRadioButtons были выбраны в разделе ActionPerformed? это не обязательно должно быть логическое значение, но именно к этому ведет меня мой мыслительный процесс. - person AEkon; 01.02.2015
comment
@AEkon. Я бы сказал, что это дополнительный вопрос, поэтому я бы порекомендовал вам обновить код, а затем задать новый вопрос. Вопросы здесь бесплатны, как в пиве. - person Andy Brown; 01.02.2015