Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Java] JCheckBox con comportamenti da JRadioButton... un aiuto.

    Salve a Tutti e buona domenica.

    Vi espongo il mio problema....

    Ho un array JCheckBox[] arrayCheck che ovviamente contiene un certo numero di
    JCheckBox; sto cercando di emulare il comportamento di alcuni di essi come se fossero
    dei JRadioButton, e cioè per esempio, supponiamo che degli elementi del JCheckBox[]
    i primi tre non siano compatibili, ovvero la selezione di uno escluda l'altro e che a
    differenza dei JRadioButton possano essere non selezionati tutti e tre e non con uno
    obbligatoriamente selezionato!!

    Esempio.....
    JCheckBox[0]
    JCheckBox[1]
    JCheckBox[2]
    JCheckBox[3]
    JCheckBox[4]
    JCheckBox[5]
    JCheckBox[6]
    ..... indici 0,1,2 non compatibili nella selezione, quindi la selezione di uno esclude gli
    altri. So che usando i gruppi di JRadioButton il problema sarebbe di semplice soluzione,
    ma oltre all'aspetto grafico dei JCheckBox a me servirebbe anche la proprietà che tutti
    gli elementi possano non essere selezionati!!!

    Ho provato con dei cicli for sull'array ma non riesco ad ottenere il risultato cerato.
    Qualcuno sa darmi una mano?

    Grazie a Tutti per l'attenzione.

  2. #2
    Ho provato a compilare questa Classe, che viene richiamata ogni volta
    si seleziona un JCHeckBox, ma il codice non funziona bene.
    codice:
    import javax.swing.ButtonGroup;
    import javax.swing.JCheckBox;
    import javax.swing.JRadioButton;
    
    public class Incompatibile extends JCheckBox {
    	private static final long serialVersionUID = 1L;
    
    	public Incompatibile(JCheckBox[] arrayCheck) {
    		
    		System.err.println("ENTRATO IN CHECK");
    		
    		// creo il gruppo dei JRadioBUtton e il relativo array
    		ButtonGroup group = new ButtonGroup();
    		JRadioButton[] arrayRadio = new JRadioButton[3];		
    		for(int k=0; k<3; k++) {
    			arrayRadio[k] = new JRadioButton();
    			group.add(arrayRadio[k]);			
    		}
    		
    		// se il JCheckBox è selezionato, seleziono il relativo JRadioButton che esclude gli altri!!!
    		for(int x=0; x<3; x++) {			
    			if(arrayCheck[x].isSelected()) arrayRadio[x].setSelected(true);
    		}
    		
    		//...vado a selezionare il JCHeckBox relativo al JRadioButton "rimasto" selezionato
    		for(int y=0; y<3; y++) {			
    			arrayCheck[y].setSelected(arrayRadio[y].isSelected());
    		}
    		
    	} // FCOS
    } // FC

  3. #3
    Ho risolto modificando il codice della Classe Incompatibile()....

    Praticamente, oltre all'array dei JCheckBox invio alla Classe
    l'ultimo dei JCheckBox selezionato, così che posso andare a
    selezionare in modo preciso il JRadioButton che mi serevirà
    per settare il resto dei JCheckBox che mi interessano.

    codice:
    import javax.swing.ButtonGroup;
    import javax.swing.JCheckBox;
    import javax.swing.JRadioButton;
    
    public class Incompatibile extends JCheckBox {
    	private static final long serialVersionUID = 1L;
    
    	public Incompatibile(JCheckBox[] arrayCheck, int lastBox) {		
    		// creo il gruppo dei JRadioBUtton e il relativo array
    		ButtonGroup group = new ButtonGroup();
    		JRadioButton[] arrayRadio = new JRadioButton[3];		
    		for(int k=0; k<3; k++) {
    			arrayRadio[k] = new JRadioButton();
    			group.add(arrayRadio[k]);			
    		}
    		
    		// seleziono il relativo JRadioButton che esclude gli altri!!!
    		arrayRadio[lastBox].setSelected(true);
    		
    		//...vado a selezionare il JCHeckBox relativo al JRadioButton "rimasto" selezionato
    		for(int y=0; y<3; y++) {			
    			arrayCheck[y].setSelected(arrayRadio[y].isSelected());
    		}
    		
    	} // FCOS
    } // FC

  4. #4
    Però ho un bel problema mannaggia!!!
    I JCheckBox che mi interessano per l'incompatibilità, ora si comportano
    troppo da JRadioButton.... uno resta per forza selezionato

  5. #5
    OK... risolto anche questo problema.

    Praticamente la Classe Incompatibile() la chiamo
    solo se il JCheckBox viene selezionato e non deselezionato.....
    codice:
    JCheckBox eBox = (JCheckBox) e.getSource();
    if(eBox.isSelected()) new Incompatibile(arrayCheck, Integer.parseInt(eBox.getName()));
    in modo che se devo deselezionare una JCheckBox non è soggetta
    alla restrizione del Group dei JRadioButton, ma se la seleziono si.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Pur rimanendo dell'idea che usare dei JCheckBox quando la semantica è quella dei JRadioButton non è user-friendly, questa è una soluzione equivalente:

    codice:
       private class MioButtonGroup extends ButtonGroup {
          @Override
          public void setSelected(ButtonModel m, boolean b) {
             super.setSelected(m, b);
             if ( !b ) {
                clearSelection();
             }
          }
       }
    Usa questa classe al posto della ButtonGroup normale.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Grazie Lele, sempre gentilissimo....
    non ho capito però quale parte del mio codice devo sostituire
    con il tuo!!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Wolvy23
    Grazie Lele, sempre gentilissimo....
    non ho capito però quale parte del mio codice devo sostituire
    con il tuo!!
    Come vedi ho creato una classe che estende ButtonGroup e ne ridefinisce un metodo.
    Tu invece hai esteso JCheckBox in modo che ciascuna JCheckBox prenda l'elenco di quelle a lei incompatibili... la classe che ho scritto io ti semplifica di molto la vita. Qui un esempio dove creo 10 checkbox e le prime 3 sono "incompatibili":

    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class Check extends JFrame {
    
       private class MioButtonGroup extends ButtonGroup {
          @Override
          public void setSelected(ButtonModel m, boolean b) {
             super.setSelected(m, b);
             if ( !b ) {
                clearSelection();
             }
          }
       }
    
       private JCheckBox[] chkBoxes;
       private MioButtonGroup gruppo;
    
       public Check() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          JPanel jp = new JPanel();
          BoxLayout bLay = new BoxLayout(jp, BoxLayout.Y_AXIS);
          jp.setLayout( bLay );
    
          chkBoxes = new JCheckBox[10];
          for(int i=0; i<10; i++) {
             chkBoxes[i] = new JCheckBox("Selezione numero " + i);
             jp.add( chkBoxes[i] );
          }
    
          // Le prime 3 sono "incompatibili"... le inserisco nel gruppo
          gruppo = new MioButtonGroup();
          for(int i=0; i<3; i++) {
             gruppo.add( chkBoxes[i] );
          }
    
          c.add(jp, BorderLayout.CENTER);
    
          setTitle("CheckBoxes come RadioButton");
          setSize(300, 400);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       public static void main(String[] args) {
          Check c = new Check();
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Grazie Lele,
    studierò il tuo codice e ti farò sapere.

    Passeranno dei giorni penso,
    perchè in queste due settimane
    ho da studiare altro per il lavoro.

    Appena lo avrò fatto ti farò sapere.

    Gentilissimo, saluti

  10. #10
    Caro LeleFT eccomi tornato.
    Appena ho potuto ho ripreso il lavoro sulla mia app
    e ho ripreso da dove avevo lasciato.
    Ho studiato il tuo codice e ho capito come funziona,
    mi risparmio un bel po' di codice.

    Grazie, come sempre sei stato molto gentile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.