IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Récupérer le numero de mes checkbox


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut Récupérer le numero de mes checkbox
    Bonjour,
    Je suis un grand débutant
    Mon but est de faire une centaine de checkbox avec une question liée à chacune
    J'ai besoin de récupérer le numero des checkbox cochés par l'utilisateur
    exemple 1 3 14 84 etc pour ensuite traiter ces réponses selons leurs numeros
    Niveau gestionnaire d'evenement je n'ai aucun probleme
    j'ai essayé de multiple solutions ,chercher sur le web en vain
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    public class Fenetre extends JFrame  implements /*ItemListener,*/ActionListener{
     
    	 //private CaseAcocher check1 = new CaseAcocher();
    	 JCheckBoxLabel jcbl=new JCheckBoxLabel(1);
    	 boolean JC1 ;
    	 boolean JC2;
    	 private   JCheckBox check1 = new JCheckBox("1.question",JC1);  
    	 private   JCheckBox check2 = new JCheckBox("2.question",JC2);  
         public Fenetre() {
    	JFrame fenetre = new JFrame(); 
    	fenetre.setTitle("Ma première fenêtre Java");
        //Définit sa taille : 400 pixels de large et 100 pixels de haut
        fenetre.setSize(600, 400);
        //Nous demandons maintenant à notre objet de se positionner au centre
        fenetre.setLocationRelativeTo(null);
        //Termine le processus lorsqu'on clique sur la croix rouge
        fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Et enfin, la rendre visible        
     
        fenetre.setVisible(true);
        //Instanciation d'un objet JPanel
     
        //Container pan =new Container();
    	JLabel label = new JLabel("1. Vous souffrez ou avez souffert de dépression pendant au moins deux semaines."); 
        //label.setText("<html><font color = #012345 >le texte en couleur </font></html>");
    	label.setForeground(new Color(105,105,105));
    	//pan.setLayout(new BorderLayout());
     
        //fenetre.getContentPane().add(new JButton("my First JButton"));
     
     
    	/*pan.add(label,BorderLayout.NORTH);
    	pan.add(check1,BorderLayout.WEST); 
    	pan.add(check1,BorderLayout.NORTH); */
     
     
        //On crée un conteneur avec gestion verticale
        Box b = Box.createVerticalBox();
        b.add(label);
        b.add(check1);
        b.add(check2);
     
        fenetre.getContentPane().add(b);
        this.setVisible(true);
     
        //fenetre.getContentPane().add(pan);  
    	//fenetre.getContentPane().setBackground(Color.RED);
     
    	//fenetre.getContentPane().add(pan);
    	//check1.addItemListener(this);
        setVisible(true);
    	check1.addActionListener(this);
    	check2.addActionListener(this);
     
    	//pan.setVisible(true);
      }
     
      /*public void itemStateChanged(ItemEvent ie) {
        JCheckBox cb = (JCheckBox) ie.getItem();
        int state = ie.getStateChange();
    	String cbString=cb.paramString();
    	if(cb.isSelected()){
     
    	 System.out.println(cb.getText() + "ok"+cbString);	
     
     
    	}
        if (state == ItemEvent.SELECTED){
          System.out.println(cb.getText() + " selected");
        }else{
          System.out.println(cb.getText() + " cleared");
        }
    	*/
    	public void actionPerformed(ActionEvent e) {
     
    		String choice = e.getActionCommand();
    		System.out.println(e.choice );
     
     
        }
      }
    J’arrive à récupérer beaucoup de choses mais pas le numero, la position de la case a cocher parmi les autres cases à cocher
    Pour conclure là avec mes cases à cocher je voudrais que quand la 1ere case est coché ça me retourne 1 2 pour la 2ieme 55 pour la 55 ieme etc
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. tu peux stocker les JCheckBox dans un tableau, l'index permettant d'avoir un numéro de checkbox
    2. Ce n'est pas vraiment fait pour ça, mais tu peux utiliser putClientProperty() et getClientProperty() pour annoter tes composants
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      JCheckbox checkbox = new JCheckbox("texte");
      checkbox.putClientProperty("checkbox.id","123");
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      if ( "123".equals(cb.getClientProperty("checkbox.id") ) {
             // c'est la checkbox 123
      }
    3. Tu peux faire une classe qui étend JCheckBox et qui lui ajouter un attribut qui te permet de la distinguer parmi les autres
    4. Tu peux utiliser une Map avec les JCheckBox en clef pour retrouver l'identifiant
    5. Tu peux gérer les checkbox via une JTable surtout si elles sont très nombreuses et variables, ce qui permet de gérer très facilement le lien avec un numéro (celui de la ligne)
    6. tu peux faire un modèle qui gère et éventuellement écoute tes checkbox, et tu ne passes plus par les composants pour en connaître l'état, mais uniquement par le modèle (et un contrôleur si tu veux gérer les composants). En encapsulant une ou plusieurs solutions citées ci-avant, tu peux cacher la complexité en ayant un accès facile à tes états, composants, etc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut
    Merci beaucoup vous m'avez donné pleins d'idées je teste tout ça

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut Probleme sur un map
    Bonjour,
    Comme indiqué plus haut j'essaye via un map de lier mes checkbox a un numéro
    Mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package bipolaireTest;
    import javax.swing.JFrame;
     
    import javax.swing.JPanel;
     
    import javax.swing.JButton;
     
    import java.awt.event.ActionListener;
     
    import java.awt.event.*;
     
    import java.awt.*;  
     
    import javax.swing.*;
    import java.util.Arrays ;
    import javax.swing.JCheckBox;
     
    import javax.swing.JLabel;
    import java.awt.Font;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.util.ArrayList;
    import java.util.Map;
    import java.util.HashMap;
    import java.util.Map.Entry;
    public class JCheckBoxInit {
    	  private String  question;
    	  private int id ;
    	  private JCheckBox jcb;
    	  private ArrayList<JCheckBox> ListOfJCheckBox;
     
    	  private String[] questions={"Une tristesse presque quotidienne, souvent toute la journée","Pas ou peu d'interêt pour quasiment toutes les activités et cela quotidiénement","Variation de l'appétit, de moins important à plus important","Problème de sommeil","Fatigue"};
     
     
    	  public JCheckBoxInit(){//super(questions[number]);
    		  for(int i=0;i<questions.length;i++){
    		  System.out.println(i);  
     
    		  this.question=questions[i];		 
    		  this.id=i;
    		  JCheckBox cb = new JCheckBox(question); 
    		  Map<Integer,JCheckBox> chb = new HashMap<Integer,JCheckBox>();
    		  chb.put(i,cb);
    		 /*ListOfJCheckBox= new ArrayList<JCheckBox>();
    		  jcb = new JCheckBox(question);  
    		  ListOfJCheckBox.add(i,jcb);*/
     
     
     
     
     
     
    		  }
    		  for(int cle:chb.keySet()) {
     
     
    			  System.out.println("-"+cle); 
     
     
     
    		  }
    		  }
     
    	  }
    Quand je test et tente via une boucle d'afficher le contenu de mon map j'ai un Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    chb cannot be resolved
    Je ne comprends pas mon code est pourtant trés simple merci pour votre aide

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par laurentg2017 Voir le message
    chb cannot be resolved
    Cela veut dire que la variable chb n'existe pas dans la portée où on l'utilise.

    Avec une bonne indendation, on voit tout de suite le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    		for (int i = 0; i < questions.length; i++) {
    			System.out.println(i);
     
    			this.question = questions[i];
    			this.id = i;
    			JCheckBox cb = new JCheckBox(question);
    			Map<Integer, JCheckBox> chb = new HashMap<Integer, JCheckBox>();
    			chb.put(i, cb);
    			/*
    			 * ListOfJCheckBox= new ArrayList<JCheckBox>(); jcb = new JCheckBox(question);
    			 * ListOfJCheckBox.add(i,jcb);
    			 */
     
    		}
    		for (int cle : chb.keySet()) {
     
    			System.out.println("-" + cle);
     
    		}
    La variable chb est créée dans le bloc de la première boucle for. Elle ne peut donc exister dans le bloc de la seconde boucle for.

    Créer la Map dans la boucle for n'a aucun intérêt : tu ne peux y associer qu'une JCheckBox avec un seul numéro et après, quand ça passe à l'itération suivante, la map est perdue, donc l'association aussi. Ton code pourrait compiler et la map être correctement remplie si tu sortais la déclaration (et l'initialisation) de la variable hors de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public JCheckBoxInit() {// super(questions[number]);
    	Map<Integer, JCheckBox> chb = new HashMap<Integer, JCheckBox>();
    	for (int i = 0; i < questions.length; i++) {
    		System.out.println(i);
     
    		this.question = questions[i];
    		this.id = i;
    		JCheckBox cb = new JCheckBox(question);
    		chb.put(i, cb);
    		/*
    		 * ListOfJCheckBox= new ArrayList<JCheckBox>(); jcb = new JCheckBox(question);
    		 * ListOfJCheckBox.add(i,jcb);
    		 */
     
    	}
    	for (int cle : chb.keySet()) {
     
    		System.out.println("-" + cle);
     
    	}
    }
    Mais ça ne servirait à rien pour ce que tu cherches à faire, parce que la variable ne serait pas accessible hors du constructeur et la map n'existerait plus après la construction de l'objet. Il faut plutôt faire comme ça, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    import java.util.AbstractList;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
     
    import javax.swing.JCheckBox;
     
    public class JCheckBoxMap implements Iterable<JCheckBox> {
     
    	private final Map<Integer, JCheckBox> map;
    	private final List<JCheckBox> list;
     
    	public JCheckBoxMap(String...questions) {
    		map = new TreeMap<>();
    		for(int i=0; i<questions.length; i++) {
    			map.put(i, new JCheckBox(questions[i]));
    		}
    		list = new AbstractList<JCheckBox>() {
     
    			@Override
    			public JCheckBox get(int index) {
    				if ( index<0 || index>=size() ) {
    					throw new IndexOutOfBoundsException("Index " +index + " is out of bounds [0,"+size()+"[");
    				}
    				return map.get(index);
    			}
     
    			@Override
    			public int size() {
    				return map.size();
    			}
    		};
    	}
     
    	public int count() {
    		return map.size();
    	}
     
    	public int size() {
    		return map.size();
    	}
     
    	public JCheckBox getCheckBox(int index) {
    		return map.get(index);
    	}
     
    	public boolean isSelected(int index) {
    		return getCheckBox(index).isSelected();
    	}
     
    	public void setSelected(int index, boolean selected) {
    		getCheckBox(index).setSelected(selected);
    	}
     
    	public String getQuestion(int index) {
    		return getCheckBox(index).getText();
    	}
     
    	@Override
    	public Iterator<JCheckBox> iterator() {
    		return map.values().iterator();
    	} 
     
    	public List<JCheckBox> asList() {
    		return Collections.unmodifiableList(list);
    	}
     
    	public Set<Map.Entry<Integer,JCheckBox>> asSet() {
    		return Collections.unmodifiableSet(map.entrySet());
    	}
     
    }
    Du coup tu as juste à faire :

    Pour la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JCheckBoxMap checkboxes;
    Pour l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    checkboxes = new JCheckBoxMap("Une tristesse presque quotidienne, souvent toute la journée","Pas ou peu d'interêt pour quasiment toutes les activités et cela quotidiénement","Variation de l'appétit, de moins important à plus important","Problème de sommeil","Fatigue");
    Pour traiter une checkbox par son numéro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    panel.add(checkboxes.getCheckBox(2));
    Traitement par for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<checkboxes.size(); i++) {
       panel.add(checkboxes.getCheckBox(i));
    }
    par forEach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(JCheckBox : checkboxes) {
       panel.add(checkboxes);
    }
    si tu as besoin d'une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<JCheckBox> liste = checkboxes.asList();
    de traiter les checkbox avec leur numéro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(Map.Entry<Integer,JCheckBox> checkbox : checkboxes.asSet()) {
       checkbox.getValue().addActionPerformed(e-> System.out.println("checkbox numéro "+ checkbox.getKey() +" : " + (checkbox.getValue().isSelected()?"":"pas") + " cochée" ));
    }
    etc...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut
    Merci beaucoup pour votre aide je venais de voir effectivement que mon chekbox était écrasé dans le map a chaque itération et que size valait toujours un et que dans un autre for ma map n'était plus visible
    merci pour votre solution ça va me permettre de comprendre mieux le fonctionnement de java je viens de JavaScript et il n'est pas évident de changer de paradigme

Discussions similaires

  1. Récupérer les valeurs de mes checkbox créées dynamiquement
    Par new_dreams dans le forum Composants
    Réponses: 2
    Dernier message: 28/03/2013, 23h41
  2. [MySQL] récupérer valeurs de mes checkbox créé dynamiquement
    Par bullrot dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/06/2010, 10h33
  3. récupérer la valeur d'une checkbox
    Par druglord dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/08/2005, 13h54
  4. Réponses: 8
    Dernier message: 13/04/2005, 15h40
  5. Réponses: 7
    Dernier message: 27/03/2005, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo