2016-06-06 2 views
1

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

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

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

Где вы добавляете функцию прослушивания действия флажка, которая соответственно включает/отключает переключатели? Если нигде - тогда это проблема. – zubergu

+2

Прочтите раздел из учебника Swing в разделе [Как использовать флажки] (http://docs.oracle.com/javase/tutorial/uiswing/components/button.html) для работы с примерами использования ActionListener. Кроме того, вы НЕ должны определять весь свой код в методе main(). Код 'CheckBoxDemo', найденный в учебнике, покажет вам, как лучше структурировать ваш код. – camickr

+0

@zubergu Спасибо! Мне действительно не хватало ItemListener/ActionListener. – Maikyl

ответ

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, также будет работать.

+1

Большое спасибо за это. Забавно, как вы можете сломать себе голову на немного кода, когда ответ настолько очевиден ... Мне действительно не хватало ItemListener. – Maikyl

+1

* «Когда ответ так очевиден ...» * Мы все это пережили. Вторая (3-я и т. Д.) Пара глаз может пригодиться в таких ситуациях. –

Смежные вопросы