package fr.unistra.pelican.gui.MultiViews; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Vector; import javax.swing.AbstractButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; /** * If you want to ensure that no more than a given number of buttons (CheckBox, RadioButtons...) are checked in a group. * * @author Benjamin Perret * */ public class MultiButtonGroup implements ItemListener { private int maxSelect=2; private Vector<AbstractButton> queue; ArrayList<AbstractButton> list =new ArrayList<AbstractButton>(); public MultiButtonGroup() { this(2); } public MultiButtonGroup(int max) { this.maxSelect=Math.max(1, max); queue = new Vector<AbstractButton>(maxSelect); } public int getNumberOfSelectedButtons() { return queue.size(); } public void add(AbstractButton button) { list.add(button); if(button.isSelected()) humSelected(button); button.addItemListener(this); } public void remove(AbstractButton button) { queue.remove(button); if(list.remove(button)) button.removeItemListener(this);; } public void clear() { queue.clear(); list.clear(); } public int size(){ return list.size(); } private void humSelected(AbstractButton b) { queue.add(b); if (queue.size() > maxSelect) { queue.firstElement().setSelected(false); } } public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == e.SELECTED || e.getStateChange() == e.DESELECTED) { AbstractButton b = (AbstractButton) e.getSource(); if (b.isSelected()) { humSelected(b); } else { queue.remove(b); } } } public void stateChanged(ChangeEvent e) { } public static void main(String [] args) { int nb=10; JFrame frame = new JFrame(); JPanel pan = new JPanel(); frame.add(pan); MultiButtonGroup mbg = new MultiButtonGroup(2); for(int i=0;i<nb;i++) { JCheckBox j = new JCheckBox("button " + i); mbg.add(j); pan.add(j); } frame.pack(); frame.setVisible(true); } }