Originariamente inviato da stefano085
data una serie di 10 check box vorrei che le caselle selezionabili dall'utente non siano più di 3.
Com'è possibile?
Si potrebbe pensare di estendere ButtonGroup. Ecco un esempio:
codice:
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class TestFrame extends JFrame
{
public TestFrame ()
{
super ("Test Frame");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (250, 150);
setLayout (new FlowLayout (FlowLayout.LEFT));
JCheckBox cb1 = new JCheckBox ("A");
JCheckBox cb2 = new JCheckBox ("B");
JCheckBox cb3 = new JCheckBox ("C");
JCheckBox cb4 = new JCheckBox ("D");
MultiButtonGroup group = new MultiButtonGroup (2);
Container c = getContentPane ();
c.add (cb1);
c.add (cb2);
c.add (cb3);
c.add (cb4);
group.add (cb1);
group.add (cb2);
group.add (cb3);
group.add (cb4);
}
public static void main (String[] args)
{
SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
TestFrame f = new TestFrame ();
f.setVisible (true);
}
});
}
}
class MultiButtonGroup extends ButtonGroup
{
private int maxCount;
private HashSet<ButtonModel> set;
public MultiButtonGroup (int maxCount)
{
this.maxCount = maxCount;
set = new HashSet<ButtonModel> ();
}
public void add (AbstractButton b)
{
if (b == null)
return;
buttons.addElement (b);
setSelected (b.getModel (), b.isSelected ());
b.getModel ().setGroup (this);
}
public void remove (AbstractButton b)
{
if (b == null)
return;
buttons.removeElement (b);
set.remove (b.getModel ());
b.getModel ().setGroup (null);
}
public boolean isSelected (ButtonModel m)
{
return set.contains (m);
}
public void setSelected (ButtonModel m, boolean b)
{
if (b && set.size() < maxCount)
set.add (m);
else
set.remove (m);
}
}
Prova a selezionare più di 2 checkbox .... non te li fa più selezionare.
(2 è il numero che ho passato a MultiButtonGroup).
Non sono sicuro al 100% che sia una ottima soluzione ... dopotutto ButtonGroup era stato pensato per gestire una "mutua esclusione" quindi solo 1 button selezionato tra tutti gli N button nel group. Infatti ha un metodo getSelection() che ritorna il model del button selezionato .... e di cui non ho fatto l'override perché sarebbe un po' dubbio ... che ritorno???
La mia soluzione comunque è semplice e molto "riutilizzabile" e funziona non solo con JCheckBox ma anche ad esempio con dei JToggleButton!