JCheckBox con changelistener

di il
4 risposte

JCheckBox con changelistener

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

4 Risposte

  • Re: JCheckBox con changelistener

    Per il JCheckBox puoi usare questo evento...trovi tanta roba sul web
    
    JCheckBox b=new JCheckBox();
    b.addItemListener(new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
                //evento da gestire
          }
    });
    
    Ciao
  • Re: JCheckBox con changelistener

    Mi sono appena accorta della tua risposta...aspettavo che mi arrivasse una mail di notifica.
    Ti ringrazio infinitamente...grazie a Dio sono andata avanti e ce l'ho fatta =) Grazie mille ancora!
  • Re: JCheckBox con changelistener

    Sarebbe meglio che spiegassi il modo in cui sei riuscita.
    Questo è lo spirito del forum, in tal modo un altro utente che ha il tuo stesso problemi trova la soluzione.
  • Re: JCheckBox con changelistener

    Hai più che ragione

    Allora, siccome se mettevo il counter sulle singole checkbox il valore mi creava quel problema, ho deciso di far fare il conteggio una volta terminata la selezione dei checkbox, e quindi il mio counter verrà costruito nell'action listener del bottone che mi servirà per andare avanti nell'applicazione...
    Quindi ho definito ognuna delle mie 6 checkbox nel seguente modo (posto il codice solo dell'ultima)...cioè ho proprio tolto il count!
    cb6 = new JCheckBox();
            cb6.setBackground(new Color(188,188,188));
            if (p6!=0) cb6.setSelected(true);
            else cb6.setSelected(false);
            
            cb6.addMouseListener(new java.awt.event.MouseListener() {
                public void mouseClicked(MouseEvent e) {
                    if (cb6.isSelected()==false) 
                    {a6 = false;
                    }
                    else a6 = true;
                    
                    if (cb6.isSelected()==true) 
                    {a6 = true;
                    }
                    else a6 = false;
                    
                }
                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.");
                }
            });
    Come prima li ho messi in un bottongroup:
    group = new checkBoxMenu (3);
            group.add(cb1);
            group.add(cb2);
            group.add(cb3);
            group.add(cb4);
            group.add(cb5);
            group.add(cb6);
    E infine l conteggio lo assegno al bottone che poi mi serve per andare in un'altra pagina, ve lo posto:
    priorita = new backgroundedButton("/presentation/icone/r_priorita.png");
            //cerca.setBounds(184, 7);
            priorita.setLocation(400, 100);
            priorita.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                count = 0;       
                if (cb1.isSelected()==true) 
                    {count++;
                    a1= true;
                    }
                else a1= false;
               if (cb2.isSelected()==true) 
                    {count++;
                    a2= true;
                    }
                else a2= false;
               if (cb3.isSelected()==true) 
                    {count++;
                    a3= true;
                    }
                else a3= false;
               if (cb4.isSelected()==true) 
                    {count++;
                    a4= true;
                    }
                else a4= false;
               if (cb5.isSelected()==true) 
                    {count++;
                    a5= true;
                    }
                else a5= false;
               if (cb6.isSelected()==true) 
                    {count++;
                    a6= true;
                    }
                else a6= false;
                        
           
                 CNavigazione.istanza().getNavigazione().setToOpen(new PIFMenuRapidoPr(a1, a2, a3, a4, a5, a6, count));   
                }
            });
    Spero possa essere utile a qualcuno
Devi accedere o registrarti per scrivere nel forum
4 risposte