如何允许“多种选择”控件?

时间:2014-07-02 01:50:08

标签: java swing jcheckbox jradiobutton buttongroup

我有一个JFrame,在那个框架中我有一些JCheckBox个组件。假设我有两组5个复选框。

我想这样做,以便我检查(例如)第一组中的第一个复选框,其他四个将被禁用。但不是那些在另一个'集'中。

问题是,如果不编写if语句的 很多 ,我不知道该怎么做。因为实际上我有大约26个复选框。一套15套,一套11套。

我认为找出哪个复选框被选中然后只是禁用所有这些复选框是明智的,但当然不会检查那个复选框。但我不知道如何查看设置了哪个复选框。我只能检查一个特定的盒子。 E.G

 @Override
public void itemStateChanged(ItemEvent e) {
    if(e.getSource.equals(CheckBox_1){
        //dostuff
    }
}

3 个答案:

答案 0 :(得分:5)

您可以编写自己的控制器,将一组中的所有按钮关联在一起,就像......

ButtonSetController controller = ButtonSetController(
   checkBox1,
   checkBox2,
   checkBox3,
   checkBox4,
   checkBox5);

控制器会为每个按钮添加ActionListener并监控状态的变化。当发生适当的状态更改时,控制器将能够自动禁用集合中的所有其他按钮...

public void actionPerformed(ActionEvent evt) {
    JCheckBox btn = (JCheckBox)evt.getSource();
    if (btn.isSelected()) {
        for (JCheckBox cb : buttons) {
            if (cb != btn) {
                cb.setSelected(false);
                cb.setEnabled(false);
            }
        }
    } // Consider re-enabling all the buttons...?
}

现在,如果你也使用了按钮数组,这一切都会变得更简单......

您也可以考虑将按钮添加到ButtonGroup,这样可以确保一次只选择一个按钮。

有关详细信息,请参阅How to Use the ButtonGroup Component

作为一个粗略的例子

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ButtonControllerExample {

    public static void main(String[] args) {
        new ButtonControllerExample();
    }

    public ButtonControllerExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JCheckBox[] buttons = new JCheckBox[8];
                buttons[0] = new JCheckBox("Bananas");
                buttons[1] = new JCheckBox("Grapes");
                buttons[2] = new JCheckBox("Apples");
                buttons[3] = new JCheckBox("Pears");
                buttons[4] = new JCheckBox("Kikiw");
                buttons[5] = new JCheckBox("Potatos");
                buttons[6] = new JCheckBox("Tomatoes");
                buttons[7] = new JCheckBox("Tim Tams");

                ButtonController<JCheckBox> controller = new ButtonController<>(4, buttons);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                for (JCheckBox cb : buttons) {
                    frame.add(cb);
                }

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ButtonController<T extends JToggleButton> {

        private List<T> selected;
        private int limit;

        public ButtonController(int limit, T... buttons) {
            if (limit <= 0) {
                throw new IllegalArgumentException("Limit can not be equal to or less then 0");
            }
            this.limit = limit;
            selected = new ArrayList<>(limit + 1);
            ItemStateHandler handler = new ItemStateHandler();
            for (T btn : buttons) {
                btn.addItemListener(handler);
            }
        }

        public class ItemStateHandler implements ItemListener {

            @Override
            public void itemStateChanged(ItemEvent e) {
                T btn = (T)e.getSource();
                if (!selected.contains(btn) && btn.isSelected()) {
                    selected.add(btn);
                    while (!selected.isEmpty() && selected.size() > limit) {
                        btn = selected.remove(0);
                        btn.setSelected(false);
                    }
                } else {
                    selected.remove(btn);
                }
            }

        }

    }

}

答案 1 :(得分:1)

ArrayList<JCheckBox> relatedBoxes = new ArrayList<>();
... add related boxes to your list
@Override
public void itemStateChanged(ItemEvent e) {
    JCheckBox selected = (JCheckBox) e.getSource();
    for (JCheckBox box : relatedBoxes) {
        if (!box.equals(selected)){
           box.setEnabled(false);        
           box.setSelected(false);
        }
    }
}

更新:以回应您的评论,现在您已进入可能适合将某些功能抽象到您自己的List实施中的领域。也就是说,以下内容可以作为一种快速而肮脏的解决方案:

ArrayList<JCheckBox> relatedBoxes = new ArrayList<>();  //consder creating class CheckBoxList extends ArrayList<JCheckBox> {}
... add related boxes to your list

@Override
public void itemStateChanged(ItemEvent e) {
    int numSelected = 0; 
    for(JCheckBox box : relatedBoxes) 
        if (box.isSelected()) numSelected++; //would be nice if you could call: if (checkBoxList.numSelected >= 6)
    if (numSelected >= 6) {
        JCheckBox selected = (JCheckBox) e.getSource();
        for (JCheckBox box : relatedBoxes) {
            if (!box.equals(selected)){
               box.setEnabled(false);        
               box.setSelected(false);
            }
        }
    } else //do something (or nothing) when less than 6 are selected
}

答案 2 :(得分:-1)

see this tutorial

您好,您可以使用CheckBoxGroup类对此复选框进行分组,例如此格式。

CheckboxGroup fruitGroup = new CheckboxGroup();

      Checkbox chkApple = new Checkbox("Apple",fruitGroup,true);
      Checkbox chkMango = new Checkbox("Mango",fruitGroup,false);
      Checkbox chkPeer = new Checkbox("Peer",fruitGroup,false);