Salve a tutti, avrei bisogno di una mano per gestire un evento in Java.
Sto lavorando ad un'applicazione in Javaswing, sarò un po' prolissa per farmi capire bene.
Allora, ho 6 JCheckBox: cb1, cb2, cb3, cb4, cb5, cb6 che appartengono ad un botton group particolare che fa sì che al massimo siano selezionate 3 su 6 checkbox.
Ecco il codice del BottonGroup esteso, è una classe apparte (classe checkBoxMenu) :
package presentation.componenti;
import java.awt.*;
import java.util.*;
import javax.swing.*;
/**
*
* @author Arianna
*
* questa classe fa in modo che possano essere cliccati al massimo 3 voci del checkbox group
*/
public class checkBoxMenu extends ButtonGroup{
private int maxCount;
private HashSet<ButtonModel> set;
public checkBoxMenu (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);
}
}
quindi, dopo aver creato i vari cb1, cb2...nella classe in cui li utilizzo (classe form_menurapido) li ho uniti nel gruppo:
group = new checkBoxMenu (3);
group.add(cb1);
group.add(cb2);
group.add(cb3);
group.add(cb4);
group.add(cb5);
group.add(cb6);
Ora, a me servirebbe un contatore che mi conta real time quante checkbox sono selezionate attualmente, e dopo ogni mia azione. Avevo pensato di inserire per ogni checkbox l'action listener seguente:
cb6.addMouseListener(new java.awt.event.MouseListener() {
public void mouseClicked(MouseEvent e) {
if (cb6.isSelected()==false)
{a6 = false; //è una variabile booleana che tengo solo per vedere se funziona
count--;
}
else a6 = true;
if (cb6.isSelected()==true)
{a6 = true;
count++;
}
else a6 = false;
System.out.println("a6="+a6+" count="+count);
}
public void mousePressed(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseReleased(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseEntered(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseExited(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
});
Ovviamente, per ognuno dei cbi...
Questo metodo funziona, tranne per il fatto che, se ho già 3 cb selezionati, e vado a cliccare sul 4°, il 4° non viene selezionato, ma il counter si decrementa ugualmente.
Avete soluzioni da suggerirmi?
Mi viene in mente che dovrei usare un changelistener, ma non so bene come funziona... io dovrei ottenere che: se il cb passa da selected a not selected il counter si decrementi di uno, se passa da not selected a selected il counter si incrementi di uno, e se invece clicco ma non c'è nessun cambio di stato allora in counter non si decrementi, nè incrementi.
Idee? grazie comunque