JCheckBox включает/отключает JRadioButton

У меня есть группа JRadioButtons и один JCheckBox. Если флажок JCheckBox снят, JRadioButtons следует отключить и сбросить, и наоборот. У меня проблема в том, проверяю ли я JCheckBox или нет, JRadioButtons остаются отключенными.

Также, прежде чем перейти к коду, не обращайте внимания на нулевой макет и отсутствие разных классов. Я быстро сделал тестовый проект, чтобы уменьшить количество кода, который мне пришлось бы вставлять сюда.

package test;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 434, 261);
        frame.getContentPane().add(panel);

        JCheckBox ckbxTestCheckBox = new JCheckBox("Test Check Box");
        ckbxTestCheckBox.setBounds(7, 7, 99, 23);
        panel.add(ckbxTestCheckBox);
        JRadioButton rdbtnTestRadioButton1 = new JRadioButton("Test Radio Button 1");
        rdbtnTestRadioButton1.setBounds(7, 34, 121, 23);
        panel.add(rdbtnTestRadioButton1);
        JRadioButton rdbtnTestRadioButton2 = new JRadioButton("Test Radio Button 2");
        rdbtnTestRadioButton2.setBounds(7, 61, 121, 23);
        panel.add(rdbtnTestRadioButton2);
        JRadioButton rdbtnTestRadioButton3 = new JRadioButton("Test Radio Button 3");
        rdbtnTestRadioButton3.setBounds(7, 88, 121, 23);
        panel.add(rdbtnTestRadioButton3);

        JRadioButton rdbtnTest[] = {rdbtnTestRadioButton1, rdbtnTestRadioButton2, rdbtnTestRadioButton3};

        ButtonGroup btnGrpTest = new ButtonGroup();
        for(int i = 0; i < rdbtnTest.length; i++){
            btnGrpTest.add(rdbtnTest[i]);
        }

        if(!ckbxTestCheckBox.isSelected()){
            for(int i = 0; i < rdbtnTest.length; i++){
                rdbtnTest[i].setEnabled(false);
                rdbtnTest[i].setSelected(false);
            }
        } else {            //Is this part even necessary?
            for(int i = 0; i < rdbtnTest.length; i++){
                rdbtnTest[i].setEnabled(true);
            }
        }
    }
}

person Maikyl    schedule 06.06.2016    source источник
comment
Где вы добавляете прослушиватель действий флажка, который соответственно включает/отключает переключатели? Если нигде - то это ваши проблемы.   -  person zubergu    schedule 06.06.2016
comment
Прочтите раздел руководства Swing по Как использовать флажки для рабочих примеров использования ActionListener. Кроме того, вы НЕ должны определять весь свой код в методе main(). Код CheckBoxDemo, найденный в руководстве, покажет вам, как лучше структурировать ваш код, чтобы следовать ему.   -  person camickr    schedule 06.06.2016
comment
@zubergu Спасибо! Мне действительно не хватало ItemListener/ActionListener.   -  person Maikyl    schedule 06.06.2016
comment
@camickr Пожалуйста, прочитайте весь вопрос, прежде чем указывать, какой код должен быть где. ;)   -  person Maikyl    schedule 06.06.2016
comment
@Maikyl, любой код, который вы публикуете здесь, все равно должен быть правильным кодом, если вы ожидаете, что люди потратят время на чтение кода. На самом деле легче создать правильный код. Например, вы не должны использовать setBounds(). Гораздо проще просто использовать метод add() и позволить FlowLayout выполнить свою работу, а затем случайным образом угадать, каким должен быть размер каждого компонента.   -  person camickr    schedule 06.06.2016


Ответы (1)


Как указал @zubergu, ваша логика должна быть написана внутри ItemListener для флажка, иначе это не имеет смысла.

Кроме того, ваша логика может быть значительно упрощена без блоков if и else:

   ckbxTestCheckBox.addItemListener(new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
                for(int i = 0; i < rdbtnTest.length; i++){

                    rdbtnTest[i].setEnabled(!ckbxTestCheckBox.isSelected());

                    if(!ckbxTestCheckBox.isSelected()) 
                       rdbtnTest[i].setSelected(false);
                }

          }
        });

Обратите внимание, что для JCheckBox также будет работать ActionListener вместо ItemListener.

person Arnaud    schedule 06.06.2016
comment
Большое спасибо за это. Забавно, как можно ломать голову над куском кода, когда ответ так очевиден... Мне действительно не хватало ItemListener. - person Maikyl; 06.06.2016
comment
когда ответ так очевиден... Мы все испытали это на себе. В таких ситуациях может очень пригодиться вторая (третья и т. д.) пара глаз. - person Andrew Thompson; 06.06.2016